diff --git a/.artifactignore b/.artifactignore new file mode 100644 index 00000000000..4e039ee7c04 --- /dev/null +++ b/.artifactignore @@ -0,0 +1,5 @@ +**/* +!target/*.bin +!target/*.log +!target/*.img.gz +!target/docker-sonic-vs.gz diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml new file mode 100644 index 00000000000..b0b84cf3b1f --- /dev/null +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -0,0 +1,127 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +trigger: none +pr: none + +schedules: +- cron: "0 0 * * *" + displayName: Daily Build + branches: + include: + - 202012 + always: true + +pool: sonicbld + +stages: +- stage: Build + variables: + CACHE_MODE: none + VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=' + jobs: + - template: azure-pipelines-build.yml + parameters: + buildOptions: '${{ variables.VERSION_CONTROL_OPTIONS }} SONIC_BUILD_JOBS=$(nproc) ENABLE_IMAGE_SIGNATURE=y' + preSteps: + - script: | + containers=$(docker container ls | grep "sonic-slave" | awk '{ print $1 }') + if [ ! -z "$containers" ]; then + docker container kill $containers || true + sleep 5 + fi + images=$(docker images 'sonic-slave-*' -a -q) + if [ ! -z "$images" ]; then + docker rmi -f $images + fi + displayName: 'Cleanup sonic slave' +- stage: UpgradeVersions + jobs: + - job: UpgradeVersions + pool: + vmImage: 'ubuntu-20.04' + steps: + - script: | + if [ -z "$(which gh)" ]; then + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key C99B11DEB97541F0 + sudo apt-add-repository https://cli.github.com/packages + sudo apt update + sudo apt install gh + fi + displayName: 'Install gh' + - checkout: self + displayName: 'Checkout code' + - download: current + patterns: '**/versions-*' + - script: | + mkdir -p target + default_platform=broadcom + artifacts=$(find $(Pipeline.Workspace) -maxdepth 1 -type d -name 'sonic-buildimage.*' | grep -v "sonic-buildimage.${default_platform}") + echo "artifacts$artifacts" + cp -r $(Pipeline.Workspace)/sonic-buildimage.${default_platform}/versions target/ + make freeze FREEZE_VERSION_OPTIONS=-r + find files/build/versions + ordered_artifacts=$(echo "$artifacts" | grep -v -E "arm64|armhf" && echo "$artifacts" | grep -E "arm64|armhf") + for artifact in $ordered_artifacts + do + rm -rf target/versions + cp -r $artifact/versions target/ + OPTIONS="-a -d" + [[ "$artifact" == *arm64* || "$artifact" == *armhf* ]] && OPTIONS="-d" + make freeze FREEZE_VERSION_OPTIONS="$OPTIONS" + done + git diff files/build/versions + displayName: 'Freeze Versions' + - script: | + if [ -z "$GIT_USER" ]; then + echo "Skipped to send the pull request, GIT_USER not set." + exit 0 + fi + GIT_STATUS=$(git status --porcelain files/build/versions) + if [ -z "$GIT_STATUS" ]; then + echo "Skipped to send the pull request, no version change in files/build/versions" + exit 0 + fi + if [ ! -d "$HOME" ]; then + sudo mkdir -p $HOME + sudo chown -R $(id -un):$(id -gn) $HOME + fi + SOURCE_BRANCH=$(Build.SourceBranch) + REPO_NAME=$(Build.Repository.Name) + [ -z "$GIT_REPO" ] && GIT_REPO=${REPO_NAME#*/} + BRANCH_NAME=repd/versions/${SOURCE_BRANCH#refs/heads/} + echo '#!/bin/bash' > git_env_password.sh + echo 'echo $GIT_PASSWORD' >> git_env_password.sh + chmod a+x git_env_password.sh + export GIT_ASKPASS=./git_env_password.sh + + git config user.name $GIT_USER + git config credential.https://github.zerozr99.workers.dev.username $GIT_USER + git add files/build/versions + git commit -m "[ci/build]: Upgrade SONiC package versions" + git checkout -b $BRANCH_NAME + git remote add remote https://github.com/$GIT_USER/$GIT_REPO + git push remote HEAD:refs/heads/$BRANCH_NAME -f + git branch -u remote/$BRANCH_NAME + + echo $GIT_PASSWORD | gh auth login --with-token + TITLE="Upgrade SONiC Versions" + BODY="Upgrade SONiC Versions" + RET=0 + if ! gh pr create -t "$TITLE" -b "$BODY" -B $(Build.SourceBranch) -R $(Build.Repository.Name) > pr.log 2>&1; then + if ! grep -q "already exists" pr.log; then + RET=1 + fi + fi + cat pr.log + exit $RET + env: + GIT_USER: $(GIT_USER) + GIT_PASSWORD: $(GIT_PASSWORD) + displayName: 'Send Pull Request' + - publish: $(System.DefaultWorkingDirectory)/files/build/versions + artifact: 'sonic-buildimage.versions' + displayName: 'Archive SONiC versions' + diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml new file mode 100644 index 00000000000..a602c233cdf --- /dev/null +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -0,0 +1,114 @@ +# The azure pipeline template for Official build, and upgrade version build + +parameters: +- name: 'jobFilters' + type: object + default: '' +- name: 'buildOptions' + type: string + default: 'SONIC_CONFIG_BUILD_JOBS=1' +- name: 'preSteps' + type: stepList + default: [] +- name: 'postSteps' + type: stepList + default: [] +- name: 'jobGroups' + type: object + default: '' + +jobs: +- template: azure-pipelines-image-template.yml + parameters: + jobFilters: ${{ parameters.jobFilters }} + preSteps: ${{ parameters.preSteps }} + postSteps: ${{ parameters.postSteps }} + jobVariables: + PLATFORM_AZP: $(GROUP_NAME) + PLATFORM_ARCH: amd64 + BUILD_NUMBER: $(Build.BuildId) + BUILD_OPTIONS: ${{ parameters.buildOptions }} + DOCKER_DATA_ROOT_FOR_MULTIARCH: /data/march/docker + dbg_image: no + swi_image: no + raw_image: no + docker_syncd_rpc_image: no + syncd_rpc_image: no + platform_rpc: no + ${{ if ne(parameters.jobGroups, '') }}: + jobGroups: ${{ parameters.jobGroups }} + ${{ if eq(parameters.jobGroups, '') }}: + jobGroups: + - name: vs + variables: + dbg_image: yes + - name: barefoot + variables: + swi_image: yes + - name: broadcom + variables: + dbg_image: yes + swi_image: yes + raw_image: yes + docker_syncd_rpc_image: yes + platform_rpc: brcm + - name: centec + variables: + dbg_image: yes + docker_syncd_rpc_image: yes + platform_rpc: centec + - name: centec-arm64 + pool: sonicbld_8c + timeoutInMinutes: 1800 + variables: + PLATFORM_ARCH: arm64 + - name: generic + variables: + dbg_image: yes + - name: innovium + variables: + dbg_image: yes + - name: marvell-armhf + pool: sonicbld_8c + timeoutInMinutes: 1800 + variables: + PLATFORM_ARCH: armhf + - name: mellanox + variables: + dbg_image: yes + docker_syncd_rpc_image: yes + syncd_rpc_image: yes + platform_rpc: mlnx + - name: nephos + variables: + dbg_image: yes + docker_syncd_rpc_image: yes + platform_rpc: nephos + buildSteps: + - bash: | + if [ $(GROUP_NAME) == vs ]; then + if [ $(dbg_image) == yes ]; then + make $BUILD_OPTIONS INSTALL_DEBUG_TOOLS=y target/sonic-vs.img.gz && mv target/sonic-vs.img.gz target/sonic-vs-dbg.img.gz + fi + make $BUILD_OPTIONS target/docker-sonic-vs.gz target/sonic-vs.img.gz target/docker-ptf.gz + else + if [ $(dbg_image) == yes ]; then + make $BUILD_OPTIONS INSTALL_DEBUG_TOOLS=y target/sonic-$(GROUP_NAME).bin && \ + mv target/sonic-$(GROUP_NAME).bin target/sonic-$(GROUP_NAME)-dbg.bin + fi + if [ $(swi_image) == yes ]; then + make $BUILD_OPTIONS ENABLE_IMAGE_SIGNATURE=y target/sonic-aboot-$(GROUP_NAME).swi + fi + if [ $(raw_image) == yes ]; then + make $BUILD_OPTIONS target/sonic-$(GROUP_NAME).raw + fi + if [ $(docker_syncd_rpc_image) == yes ]; then + make $BUILD_OPTIONS ENABLE_SYNCD_RPC=y target/docker-syncd-$(platform_rpc)-rpc.gz + fi + if [ $(syncd_rpc_image) == yes ]; then + make $BUILD_OPTIONS ENABLE_SYNCD_RPC=y target/sonic-$(GROUP_NAME).bin + mv target/sonic-mellanox.bin target/sonic-$(GROUP_NAME)-rpc.bin + fi + make $BUILD_OPTIONS target/sonic-$(GROUP_NAME).bin + fi + displayName: "Build sonic image" diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml new file mode 100644 index 00000000000..81f181cf3cb --- /dev/null +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -0,0 +1,58 @@ +# The azure pipeline template for PR build, Official build, and upgrade version build + +parameters: +- name: 'jobFilters' + type: object + default: '' +- name: 'preSteps' + type: stepList + default: [] +- name: 'buildSteps' + type: stepList + default: [] +- name: 'postSteps' + type: stepList + default: [] +- name: jobGroups + type: object + default: [] +- name: jobVariables + type: object + default: [] +jobs: +- template: azure-pipelines-job-groups.yml + parameters: + jobFilters: ${{ parameters.jobFilters }} + jobVariables: ${{ parameters.jobVariables }} + preSteps: + - template: cleanup.yml + - ${{ parameters. preSteps }} + - script: | + if [ -n "$(CACHE_MODE)" ] && echo $(PLATFORM_AZP) | grep -E -q "^(vs|broadcom|mellanox)$"; then + CACHE_OPTIONS="SONIC_DPKG_CACHE_METHOD=$(CACHE_MODE) SONIC_DPKG_CACHE_SOURCE=/nfs/dpkg_cache/$(PLATFORM_AZP)" + BUILD_OPTIONS="$(BUILD_OPTIONS) $CACHE_OPTIONS" + echo "##vso[task.setvariable variable=BUILD_OPTIONS]$BUILD_OPTIONS" + fi + displayName: "Set cache options" + - checkout: self + submodules: recursive + displayName: 'Checkout code' + - script: | + BRANCH_NAME=$(Build.SourceBranchName) + [ -n "$SYSTEM_PULLREQUEST_PULLREQUESTID" ] && BRANCH_NAME="$SYSTEM_PULLREQUEST_TARGETBRANCH-$SYSTEM_PULLREQUEST_PULLREQUESTNUMBER" + git checkout -b $BRANCH_NAME + sudo modprobe overlay + sudo apt-get install -y acl + sudo bash -c "echo 1 > /proc/sys/vm/compact_memory" + ENABLE_DOCKER_BASE_PULL=y make PLATFORM=$(PLATFORM_AZP) PLATFORM_ARCH=$(PLATFORM_ARCH) configure + displayName: 'Make configure' + postSteps: + - script: cp target -r $(Build.ArtifactStagingDirectory)/ + displayName: Copy Artifacts + - publish: $(Build.ArtifactStagingDirectory) + artifact: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)' + displayName: "Archive sonic image" + - ${{ parameters.postSteps }} + - template: cleanup.yml + jobGroups: ${{ parameters.jobGroups }} + buildSteps: ${{ parameters.buildSteps }} diff --git a/.azure-pipelines/azure-pipelines-job-groups.yml b/.azure-pipelines/azure-pipelines-job-groups.yml new file mode 100644 index 00000000000..d5be80dcde3 --- /dev/null +++ b/.azure-pipelines/azure-pipelines-job-groups.yml @@ -0,0 +1,57 @@ +parameters: +- name: 'preSteps' + type: stepList + default: [] +- name: 'buildSteps' + type: stepList + default: [] +- name: "postSteps" + type: stepList + default: [] +- name: 'jobGroups' + type: object + default: [] +- name: 'jobVariables' + type: object + default: {} +- name: 'scriptEnv' + type: object + default: '' +- name: 'timeoutInMinutes' + type: 'number' + default: 600 +- name: 'jobFilters' + type: object + default: '' + +jobs: +- ${{ each jobGroup in parameters.jobGroups }}: + - ${{ if or(eq(parameters.jobFilters, ''), containsValue(parameters.jobFilters, jobGroup.name), endswith(variables['Build.DefinitionName'], format('.{0}{1}', jobGroup.name, jobGroup.extName))) }}: + - job: ${{ replace(format('{0}{1}', jobGroup.name, jobGroup.extName), '-', '_') }} + ${{ each pair in jobGroup }}: + ${{ if not(in(pair.key, 'job', 'name', 'extName', 'variables', 'steps', 'script', 'scriptEnv')) }}: + ${{ pair.key }}: ${{ pair.value }} + ${{ if eq(jobGroup.timeoutInMinutes, '') }}: + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + variables: + GROUP_NAME: ${{ jobGroup.name }} + GROUP_EXTNAME: '${{ jobGroup.extName }}' + GROUP_NAMES: ${{ join(',', parameters.jobGroups.*.name ) }} + ${{ if ne(jobGroup.variables, '') }}: + ${{ jobGroup.variables }} + ${{ each para in parameters.jobvariables }}: + ${{ if eq(jobGroup.variables[para.key], '') }}: + ${{ para.key }}: ${{ para.value }} + steps: + - ${{ parameters.preSteps }} + - ${{ if ne(jobGroup.script, '') }}: + - script: | + ${{ jobGroup.script }} + env: + ${{ if ne(parameters.scriptEnv, '') }}: + ${{ parameters.scriptEnv }} + displayName: 'JobScript' + - ${{ if ne(jobGroup.steps, '') }}: + - ${{ jobGroup.steps }} + - ${{ parameters.buildSteps }} + - ${{ parameters.postSteps }} diff --git a/.azure-pipelines/cleanup.yml b/.azure-pipelines/cleanup.yml new file mode 100644 index 00000000000..6569c8ed0bf --- /dev/null +++ b/.azure-pipelines/cleanup.yml @@ -0,0 +1,14 @@ +steps: +- script: | + if sudo [ -f /var/run/march/docker.pid ] ; then + pid=`sudo cat /var/run/march/docker.pid` ; sudo kill $pid + fi + sudo rm -f /var/run/march/docker.pid + sudo rm -rf /data/march/docker + + # clean native docker build + if sudo [ -f dockerfs/var/run/docker.pid ] ; then + pid=`sudo cat dockerfs/var/run/docker.pid` ; sudo kill $pid + fi + sudo rm -rf $(ls -A1) + displayName: "Clean Workspace" diff --git a/.azure-pipelines/official-build.yml b/.azure-pipelines/official-build.yml new file mode 100644 index 00000000000..9cd27f33463 --- /dev/null +++ b/.azure-pipelines/official-build.yml @@ -0,0 +1,61 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +schedules: +- cron: "0 8 * * *" + displayName: Daily midnight build + branches: + include: + - master + - 202012 + always: true +- cron: "0 4 * * *" + displayName: nightly build for release + branches: + include: + - 201911 + - 201811 + +resources: + repositories: + - repository: buildimage + type: github + name: sonic-net/sonic-buildimage + ref: master + endpoint: sonic-net + +trigger: none +pr: none + +variables: +- template: .azure-pipelines/template-variables.yml@buildimage + +stages: +- stage: Build + pool: sonicbld + variables: + CACHE_MODE: wcache + ${{ if eq(variables['Build.SourceBranchName'], '202012') }}: + VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=deb,py2,py3,web' + jobs: + - template: azure-pipelines-build.yml + parameters: + buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) ${{ variables.VERSION_CONTROL_OPTIONS }}' + jobFilters: none + jobGroups: + - name: vs + - name: barefoot + variables: + swi_image: yes + - name: broadcom + variables: + swi_image: yes + - name: innovium + - name: mellanox + variables: + docker_syncd_rpc_image: yes + syncd_rpc_image: yes + platform_rpc: mlnx + - name: nephos diff --git a/.azure-pipelines/run-test-template.yml b/.azure-pipelines/run-test-template.yml new file mode 100644 index 00000000000..071286d0fb5 --- /dev/null +++ b/.azure-pipelines/run-test-template.yml @@ -0,0 +1,84 @@ +parameters: +- name: dut + type: string +- name: tbname + type: string +- name: tbtype + type: string +- name: ptf_name + type: string + +steps: +- checkout: self + clean: true + displayName: 'checkout sonic-mgmt repo' + +- task: DownloadPipelineArtifact@2 + inputs: + artifact: sonic-buildimage.vs + displayName: "Download sonic-buildimage.vs artifact" + +- script: | + set -x + sudo mkdir -p /data/sonic-vm/images + sudo cp -v ../target/sonic-vs.img.gz /data/sonic-vm/images/sonic-vs.img.gz + sudo gzip -fd /data/sonic-vm/images/sonic-vs.img.gz + username=$(id -un) + sudo chown -R $username.$username /data/sonic-vm + + pushd /data/sonic-mgmt + git remote update + git reset --hard origin/master + sed -i s/use_own_value/${username}/ ansible/veos_vtb + echo aaa > ansible/password.txt + docker exec sonic-mgmt bash -c "pushd /data/sonic-mgmt/ansible;./testbed-cli.sh -d /data/sonic-vm -m $(inventory) -t $(testbed_file) -k ceos refresh-dut ${{ parameters.tbname }} password.txt" && sleep 180 + displayName: "Setup testbed" + +- script: | + rm -rf $(Build.ArtifactStagingDirectory)/* + docker exec sonic-mgmt bash -c "/data/sonic-mgmt/tests/kvmtest.sh -en -T ${{ parameters.tbtype }} ${{ parameters.tbname }} ${{ parameters.dut }}" + displayName: "Run tests" + +- script: | + # save dut state if test fails + virsh_version=$(virsh --version) + if [ $virsh_version == "6.0.0" ]; then + mkdir -p $(Build.ArtifactStagingDirectory)/kvmdump + virsh -c qemu:///system list + virsh -c qemu:///system save ${{ parameters.dut }} $(Build.ArtifactStagingDirectory)/kvmdump/${{ parameters.dut }}.memdmp + virsh -c qemu:///system dumpxml ${{ parameters.dut }} > $(Build.ArtifactStagingDirectory)/kvmdump/${{ parameters.dut }}.xml + img=$(virsh -c qemu:///system domblklist ${{ parameters.dut }} | grep vda | awk '{print $2}') + cp $img $(Build.ArtifactStagingDirectory)/kvmdump/${{ parameters.dut }}.img + gzip $(Build.ArtifactStagingDirectory)/kvmdump/${{ parameters.dut }}.img + sudo gzip $(Build.ArtifactStagingDirectory)/kvmdump/${{ parameters.dut }}.memdmp + virsh -c qemu:///system undefine ${{ parameters.dut }} + fi + + docker commit ${{ parameters.ptf_name }} docker-ptf:$(Build.BuildNumber) + docker save docker-ptf:$(Build.BuildNumber) | gzip -c > $(Build.ArtifactStagingDirectory)/kvmdump/docker-ptf-dump.gz + docker rmi docker-ptf:$(Build.BuildNumber) + displayName: "Collect kvmdump" + condition: failed() + +- script: | + cp -r /data/sonic-mgmt/tests/logs $(Build.ArtifactStagingDirectory)/ + username=$(id -un) + sudo chown -R $username.$username $(Build.ArtifactStagingDirectory) + displayName: "Collect test logs" + condition: succeededOrFailed() + +- publish: $(Build.ArtifactStagingDirectory)/kvmdump + artifact: sonic-buildimage.kvmtest.${{ parameters.tbtype}}.memdump@$(System.JobAttempt) + displayName: "Archive sonic kvm memdump" + condition: failed() + +- publish: $(Build.ArtifactStagingDirectory)/logs + artifact: sonic-buildimage.kvmtest.${{ parameters.tbtype }}.log@$(System.JobAttempt) + displayName: "Archive sonic kvm logs" + condition: succeededOrFailed() + +- task: PublishTestResults@2 + inputs: + testResultsFiles: '$(Build.ArtifactStagingDirectory)/logs/**/*.xml' + testRunTitle: kvmtest.${{ parameters.tbtype }} + condition: succeededOrFailed() diff --git a/.gitignore b/.gitignore index e763b1d26a7..2dbae5543a1 100644 --- a/.gitignore +++ b/.gitignore @@ -141,9 +141,12 @@ installer/x86_64/platforms/ src/sonic-config-engine/**/*.pyc src/sonic-config-engine/build src/sonic-config-engine/sonic_config_engine.egg-info -src/sonic-daemon-base/**/*.pyc -src/sonic-daemon-base/build -src/sonic-daemon-base/sonic_daemon_base.egg-info + +src/sonic-py-common/**/*.pyc +src/sonic-py-common/.eggs/ +src/sonic-py-common/build +src/sonic-py-common/dist +src/sonic-py-common/sonic_py_common.egg-info # Misc. files files/initramfs-tools/arista-convertfs diff --git a/.gitmodules b/.gitmodules index ca8b4b0098a..1a547d9ff38 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,15 +1,15 @@ [submodule "sonic-swss-common"] path = src/sonic-swss-common - url = https://github.com/Azure/sonic-swss-common + url = https://github.com/sonic-net/sonic-swss-common [submodule "sonic-linux-kernel"] path = src/sonic-linux-kernel - url = https://github.com/Azure/sonic-linux-kernel + url = https://github.com/sonic-net/sonic-linux-kernel [submodule "sonic-sairedis"] path = src/sonic-sairedis - url = https://github.com/Azure/sonic-sairedis + url = https://github.com/sonic-net/sonic-sairedis [submodule "sonic-swss"] path = src/sonic-swss - url = https://github.com/Azure/sonic-swss + url = https://github.com/sonic-net/sonic-swss [submodule "src/p4c-bm/p4c-bm"] path = platform/p4/p4c-bm/p4c-bm url = https://github.com/krambn/p4c-bm @@ -18,35 +18,35 @@ url = https://github.com/p4lang/p4-hlir [submodule "quagga"] path = src/sonic-quagga - url = https://github.com/Azure/sonic-quagga + url = https://github.com/sonic-net/sonic-quagga branch = debian/0.99.24.1 [submodule "sonic-dbsyncd"] path = src/sonic-dbsyncd - url = https://github.com/Azure/sonic-dbsyncd + url = https://github.com/sonic-net/sonic-dbsyncd [submodule "src/sonic-py-swsssdk"] path = src/sonic-py-swsssdk - url = https://github.com/Azure/sonic-py-swsssdk.git + url = https://github.com/sonic-net/sonic-py-swsssdk.git [submodule "src/sonic-snmpagent"] path = src/sonic-snmpagent - url = https://github.com/Azure/sonic-snmpagent + url = https://github.com/sonic-net/sonic-snmpagent [submodule "src/ptf"] path = src/ptf url = https://github.com/p4lang/ptf.git [submodule "src/sonic-utilities"] path = src/sonic-utilities - url = https://github.com/Azure/sonic-utilities + url = https://github.com/sonic-net/sonic-utilities [submodule "platform/broadcom/sonic-platform-modules-arista"] path = platform/broadcom/sonic-platform-modules-arista url = https://github.com/aristanetworks/sonic [submodule "src/sonic-platform-common"] path = src/sonic-platform-common - url = https://github.com/Azure/sonic-platform-common + url = https://github.com/sonic-net/sonic-platform-common [submodule "src/sonic-platform-daemons"] path = src/sonic-platform-daemons - url = https://github.com/Azure/sonic-platform-daemons + url = https://github.com/sonic-net/sonic-platform-daemons [submodule "src/sonic-frr/frr"] path = src/sonic-frr/frr - url = https://github.com/Azure/sonic-frr.git + url = https://github.com/sonic-net/sonic-frr.git branch = frr/7.2 [submodule "platform/p4/p4-hlir/p4-hlir-v1.1"] path = platform/p4/p4-hlir/p4-hlir-v1.1 @@ -68,17 +68,22 @@ url = https://github.com/Mellanox/SAI-Implementation [submodule "src/sonic-mgmt-framework"] path = src/sonic-mgmt-framework - url = https://github.com/Azure/sonic-mgmt-framework + url = https://github.com/sonic-net/sonic-mgmt-framework [submodule "src/sonic-telemetry"] path = src/sonic-telemetry - url = https://github.com/Azure/sonic-telemetry + url = https://github.com/sonic-net/sonic-telemetry + branch = 201911 [submodule "Switch-SDK-drivers"] path = platform/mellanox/sdk-src/sx-kernel/Switch-SDK-drivers url = https://github.com/Mellanox/Switch-SDK-drivers [submodule "src/sonic-restapi"] path = src/sonic-restapi - url = https://github.com/Azure/sonic-restapi.git + url = https://github.com/sonic-net/sonic-restapi.git branch = master [submodule "src/sonic-ztp"] path = src/sonic-ztp - url = https://github.com/Azure/sonic-ztp + url = https://github.com/sonic-net/sonic-ztp +[submodule "src/dhcprelay"] + path = src/dhcprelay + url = https://github.com/sonic-net/sonic-dhcp-relay.git + branch = 201911 diff --git a/Makefile.work b/Makefile.work index 14c433e4f5d..06052690398 100644 --- a/Makefile.work +++ b/Makefile.work @@ -9,7 +9,7 @@ # through http. # * ENABLE_ZTP: Enables zero touch provisioning. # * SHUTDOWN_BGP_ON_START: Sets admin-down state for all bgp peerings after restart. -# * INSTALL_KUBERNETES: Allows including Kubernetes +# * INCLUDE_KUBERNETES: Allows including Kubernetes # * ENABLE_PFCWD_ON_START: Enable PFC Watchdog (PFCWD) on server-facing ports # * by default for TOR switch. # * ENABLE_SYNCD_RPC: Enables rpc-based syncd builds. @@ -39,6 +39,7 @@ SHELL = /bin/bash USER := $(shell id -un) PWD := $(shell pwd) +USER_LC := $(shell echo $(USER) | tr A-Z a-z) ifeq ($(USER), root) $(error Add your user account to docker group and use your user account to make. root or sudo are not supported!) @@ -78,10 +79,10 @@ SLAVE_DIR = sonic-slave-stretch else SLAVE_DIR = sonic-slave-jessie endif -SLAVE_BASE_TAG = $(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile && sha1sum $(SLAVE_DIR)/Dockerfile | awk '{print substr($$1,0,11);}') +SLAVE_BASE_TAG = $(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile && sha1sum $(SLAVE_DIR)/Dockerfile | awk '{print substr($$1,0,11);}') SLAVE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile.user $(SLAVE_DIR)/Dockerfile | sha1sum | awk '{print substr($$1,0,11);}') SLAVE_BASE_IMAGE = $(SLAVE_DIR) -SLAVE_IMAGE = $(SLAVE_BASE_IMAGE)-$(USER) +SLAVE_IMAGE = $(SLAVE_BASE_IMAGE)-$(USER_LC) OVERLAY_MODULE_CHECK := \ lsmod | grep -q "^overlay " &>/dev/null || \ @@ -104,10 +105,14 @@ DOCKER_RUN := docker run --rm=true --privileged \ -w $(DOCKER_BUILDER_WORKDIR) \ -e "http_proxy=$(http_proxy)" \ -e "https_proxy=$(https_proxy)" \ - -i$(if $(TERM),t,) + -i$(shell { if [ -t 0 ]; then echo t; fi }) include rules/config +ifneq ($(DEFAULT_CONTAINER_REGISTRY),) +override DEFAULT_CONTAINER_REGISTRY := $(DEFAULT_CONTAINER_REGISTRY)/ +endif + ifeq ($(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD), y) DOCKER_RUN += -v /var/run/docker.sock:/var/run/docker.sock endif @@ -131,7 +136,7 @@ ifneq (,$(filter $(CONFIGURED_ARCH), armhf arm64)) DOCKER_SERVICE_SAFE_KILLER := (MARCH_PID=`ps -eo pid,cmd | grep "[0-9] dockerd.*march" | awk '{print $$1}'`; echo "Killing march docker $$MARCH_PID"; [ -z "$$MARCH_PID" ] || sudo kill -9 "$$MARCH_PID";) DOCKER_SERVICE_MULTIARCH_CHECK := ($(DOCKER_SERVICE_SAFE_KILLER); sudo rm -fr /var/run/march/; (echo "Starting docker march service..."; sudo $(SONIC_NATIVE_DOCKERD_FOR_MUTLIARCH) &) &>/dev/null ; sleep 2; sudo $(SONIC_USERFACL_DOCKERD_FOR_MUTLIARCH);) - # Docker service to load the compiled dockers-*.gz + # Docker service to load the compiled dockers-*.gz SONIC_NATIVE_DOCKERD_FOR_DOCKERFS := rm -fr $(PWD)/dockerfs/; mkdir -p $(PWD)/dockerfs/; sudo dockerd --storage-driver=overlay2 --iptables=false \ --data-root $(PWD)/dockerfs/var/lib/docker/ --exec-root=$(PWD)/dockerfs/var/run/docker/ \ -H unix://$(PWD)/dockerfs/var/run/docker.sock -p $(PWD)/dockerfs/var/run/docker.pid & @@ -166,10 +171,10 @@ SONIC_BUILD_INSTRUCTION := make \ ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \ ENABLE_ZTP=$(ENABLE_ZTP) \ SHUTDOWN_BGP_ON_START=$(SHUTDOWN_BGP_ON_START) \ - INSTALL_KUBERNETES=$(INSTALL_KUBERNETES) \ + INCLUDE_KUBERNETES=$(INCLUDE_KUBERNETES) \ KUBERNETES_VERSION=$(KUBERNETES_VERSION) \ + KUBERNETES_CNI_VERSION=$(KUBERNETES_CNI_VERSION) \ K8s_GCR_IO_PAUSE_VERSION=$(K8s_GCR_IO_PAUSE_VERSION) \ - K8s_CNI_FLANNEL_VERSION=$(K8s_CNI_FLANNEL_VERSION) \ SONIC_ENABLE_PFCWD_ON_START=$(ENABLE_PFCWD_ON_START) \ SONIC_ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \ SONIC_INSTALL_DEBUG_TOOLS=$(INSTALL_DEBUG_TOOLS) \ @@ -181,14 +186,20 @@ SONIC_BUILD_INSTRUCTION := make \ KERNEL_PROCURE_METHOD=$(KERNEL_PROCURE_METHOD) \ HTTP_PROXY=$(http_proxy) \ HTTPS_PROXY=$(https_proxy) \ - SONIC_ENABLE_SYSTEM_TELEMETRY=$(ENABLE_SYSTEM_TELEMETRY) \ - SONIC_ENABLE_RESTAPI=$(ENABLE_RESTAPI) \ + SONIC_INCLUDE_SYSTEM_TELEMETRY=$(INCLUDE_SYSTEM_TELEMETRY) \ + SONIC_INCLUDE_RESTAPI=$(INCLUDE_RESTAPI) \ EXTRA_JESSIE_TARGETS=$(EXTRA_JESSIE_TARGETS) \ + DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \ $(SONIC_OVERRIDE_BUILD_VARS) .PHONY: sonic-slave-build sonic-slave-bash init reset .DEFAULT_GOAL := all +FAKETIME := rm -rf faketime_0.9.7-2_amd64.deb libfaketime_0.9.7-2_amd64.deb; \ + curl "https://sonicstoragepublic.blob.core.windows.net/public/libfaketime_0.9.7-2_amd64.deb" -o libfaketime_0.9.7-2_amd64.deb; \ + curl "https://sonicstoragepublic.blob.core.windows.net/public/faketime_0.9.7-2_amd64.deb" -o faketime_0.9.7-2_amd64.deb; \ + cp faketime_0.9.7-2_amd64.deb libfaketime_0.9.7-2_amd64.deb dockers/docker-base/; \ + cp faketime_0.9.7-2_amd64.deb libfaketime_0.9.7-2_amd64.deb sonic-slave-jessie/ %:: ifneq (,$(filter $(CONFIGURED_ARCH), armhf arm64)) @@ -199,7 +210,8 @@ ifneq ($(BLDENV), ) endif endif @$(OVERLAY_MODULE_CHECK) - + @$(FAKETIME) + @docker inspect --type image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) &> /dev/null || \ { echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Building... ; \ $(DOCKER_BASE_BUILD) ; } diff --git a/README.buildsystem.md b/README.buildsystem.md index f2d804d7e90..44fa7e5ffff 100644 --- a/README.buildsystem.md +++ b/README.buildsystem.md @@ -243,7 +243,7 @@ _Recommend: Rename image built using INSTALL_DEBUG_TOOLS=y to mark it explicit. * To debug a core file in non-SONiC environment that supports docker * `docker load -i docker--dbg.gz` * copy your unzipped core file into ~/debug - * `docker run -it -entrypoint=/bin/bash -v ~/debug:/debug ` + * `docker run -it --entrypoint=/bin/bash -v ~/debug:/debug ` * `gdb /usr/bin/ -c /debug/` ### Debug SONiC image diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 00000000000..31c9cf14342 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,122 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +trigger: none + +pr: none + +name: $(TeamProject)_$(Build.DefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) + +resources: + repositories: + - repository: sonic-mgmt + type: github + name: sonic-net/sonic-mgmt + endpoint: sonic-net + - repository: buildimage + type: github + name: sonic-net/sonic-buildimage + endpoint: sonic-net + ref: master + +variables: +- template: .azure-pipelines/template-variables.yml@buildimage + +stages: +- stage: Build + pool: sonicbld + variables: + CACHE_MODE: rcache + ${{ if eq(variables['Build.SourceBranchName'], '202012') }}: + VERSION_CONTROL_OPTIONS: 'SONIC_VERSION_CONTROL_COMPONENTS=deb,py2,py3,web' + jobs: + - template: .azure-pipelines/azure-pipelines-build.yml + parameters: + buildOptions: 'USERNAME=admin SONIC_BUILD_JOBS=$(nproc) ${{ variables.VERSION_CONTROL_OPTIONS }}' + jobGroups: + - name: vs + - name: broadcom + - name: mellanox +# TODO: test is failing now. +# when fixed, we can remove condition key word +- stage: Test + condition: false + variables: + - name: inventory + value: veos_vtb + - name: testbed_file + value: vtestbed.csv + + jobs: + - job: + pool: sonictest + displayName: "vstest" + timeoutInMinutes: 60 + steps: + - checkout: self + clean: true + submodules: recursive + displayName: 'Checkout code' + + - task: DownloadPipelineArtifact@2 + inputs: + source: specific + project: build + pipeline: 9 + artifacts: sonic-swss-common.amd64.ubuntu20_04 + runVersion: 'latestFromBranch' + runBranch: 'refs/heads/master' + displayName: "Download sonic swss common deb packages" + + - task: DownloadPipelineArtifact@2 + inputs: + artifact: sonic-buildimage.vs + displayName: "Download sonic-buildimage.vs artifact" + + - script: | + set -x + sudo dpkg -i --force-confask,confnew ../sonic-swss-common.amd64.ubuntu20_04/libswsscommon_1.0.0_amd64.deb + sudo dpkg -i ../sonic-swss-common.amd64.ubuntu20_04/python3-swsscommon_1.0.0_amd64.deb + sudo docker load -i ../target/docker-sonic-vs.gz + docker tag docker-sonic-vs:latest docker-sonic-vs:$(Build.BuildNumber) + username=$(id -un) + trap "docker ps; docker images; ip netns list; \ + docker rmi docker-sonic-vs:$(Build.BuildNumber); \ + ip netns list | grep -E [-]srv[0-9]+ | awk '{print $1}' | xargs -I {} sudo ip netns delete {}; \ + sudo chown -R ${username}.${username} .; \ + sudo chown -R ${username}.${username} $(System.DefaultWorkingDirectory)" EXIT + pushd platform/vs/tests + sudo py.test -v --junitxml=tr.xml --imgname=docker-sonic-vs:$(Build.BuildNumber) + displayName: "Run vs tests" + - task: PublishTestResults@2 + inputs: + testResultsFiles: '**/tr.xml' + testRunTitle: vstest + + - job: + pool: sonictest + displayName: "kvmtest-t0" + timeoutInMinutes: 240 + + steps: + - template: .azure-pipelines/run-test-template.yml + parameters: + dut: vlab-01 + tbname: vms-kvm-t0 + ptf_name: ptf_vms6-1 + tbtype: t0 + + - job: + pool: sonictest-t1-lag + displayName: "kvmtest-t1-lag" + timeoutInMinutes: 240 + + steps: + - template: .azure-pipelines/run-test-template.yml + parameters: + dut: vlab-03 + tbname: vms-kvm-t1-lag + ptf_name: ptf_vms6-2 + tbtype: t1-lag diff --git a/build_debian.sh b/build_debian.sh index be953f51b09..b23a16de336 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -37,7 +37,7 @@ if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then else DOCKER_VERSION=5:18.09.8~3-0~debian-stretch fi -LINUX_KERNEL_VERSION=4.9.0-11-2 +LINUX_KERNEL_VERSION=4.9.0-14-2 ## Working directory to prepare the file system FILESYSTEM_ROOT=./fsroot @@ -81,9 +81,9 @@ if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then # qemu arm bin executable for cross-building sudo mkdir -p $FILESYSTEM_ROOT/usr/bin sudo cp /usr/bin/qemu*static $FILESYSTEM_ROOT/usr/bin || true - sudo http_proxy=$http_proxy debootstrap --variant=minbase --arch $CONFIGURED_ARCH stretch $FILESYSTEM_ROOT http://deb.debian.org/debian + sudo http_proxy=$http_proxy debootstrap --variant=minbase --arch $CONFIGURED_ARCH stretch $FILESYSTEM_ROOT http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z else - sudo http_proxy=$http_proxy debootstrap --variant=minbase --arch $CONFIGURED_ARCH stretch $FILESYSTEM_ROOT http://debian-archive.trafficmanager.net/debian + sudo http_proxy=$http_proxy debootstrap --variant=minbase --arch $CONFIGURED_ARCH stretch $FILESYSTEM_ROOT http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z fi ## Config hostname and hosts, otherwise 'sudo ...' will complain 'sudo: unable to resolve host ...' @@ -193,6 +193,7 @@ echo '[INFO] Install docker' ## Install apparmor utils since they're missing and apparmor is enabled in the kernel ## Otherwise Docker will fail to start sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install apparmor +sudo cp files/image_config/ntp/ntp-apparmor $FILESYSTEM_ROOT/etc/apparmor.d/local/usr.sbin.ntpd sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install apt-transport-https \ ca-certificates \ curl \ @@ -207,7 +208,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get update sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install docker-ce=${DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION} sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y remove software-properties-common gnupg2 -if [ "$INSTALL_KUBERNETES" == "y" ] +if [ "$INCLUDE_KUBERNETES" == "y" ] then ## Install Kubernetes echo '[INFO] Install kubernetes' @@ -217,14 +218,9 @@ then ## Check out the sources list update matches current Debian version sudo cp files/image_config/kubernetes/kubernetes.list $FILESYSTEM_ROOT/etc/apt/sources.list.d/ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get update - if [[ $KUBERNETES_VERSION == 1.18.0 ]]; then - # kubeadm 1.18.0 package auto install has some dependency error so install - # those package explicitly. - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubernetes-cni=0.7.5-00 - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubelet=1.18.3-00 - sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubectl=1.18.3-00 - fi - # else kubeadm package auto install kubelet & kubectl + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubernetes-cni=${KUBERNETES_CNI_VERSION}-00 + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubelet=${KUBERNETES_VERSION}-00 + sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubectl=${KUBERNETES_VERSION}-00 sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install kubeadm=${KUBERNETES_VERSION}-00 # kubeadm package auto install kubelet & kubectl else @@ -239,11 +235,15 @@ sudo cp files/docker/docker.service.conf $_ sudo sed -i '/After=/s/$/ containerd.service/' $FILESYSTEM_ROOT/lib/systemd/system/docker.service ## Create default user -## Note: user should be in the group with the same name, and also in sudo/docker group +## Note: user should be in the group with the same name, and also in sudo/docker/redis groups sudo LANG=C chroot $FILESYSTEM_ROOT useradd -G sudo,docker $USERNAME -c "$DEFAULT_USERINFO" -m -s /bin/bash ## Create password for the default user echo "$USERNAME:$PASSWORD" | sudo LANG=C chroot $FILESYSTEM_ROOT chpasswd +## Create redis group +sudo LANG=C chroot $FILESYSTEM_ROOT groupadd -f redis +sudo LANG=C chroot $FILESYSTEM_ROOT usermod -aG redis $USERNAME + if [[ $CONFIGURED_ARCH == amd64 ]]; then ## Pre-install hardware drivers sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ @@ -295,7 +295,6 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in ethtool \ screen \ hping3 \ - python-scapy \ tcptraceroute \ mtr-tiny \ locales \ @@ -303,7 +302,10 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in ipmitool \ ndisc6 \ makedumpfile \ - conntrack + conntrack \ + python-pip \ + jq \ + haveged if [[ $CONFIGURED_ARCH == amd64 ]]; then @@ -333,7 +335,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT bash -c "find /usr/share/i18n/locales/ ! -na # Install certain fundamental packages from stretch-backports in order to get # more up-to-date (but potentially less stable) versions sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y -t stretch-backports install \ - picocom + picocom libsystemd0 systemd if [[ $CONFIGURED_ARCH == amd64 ]]; then sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y download \ @@ -370,17 +372,18 @@ set /files/etc/ssh/sshd_config/#comment[following-sibling::*[1][self::ClientAliv save quit EOF -# Configure sshd to listen for v4 connections; disable listening for v6 connections -sudo sed -i 's/^ListenAddress ::/#ListenAddress ::/' $FILESYSTEM_ROOT/etc/ssh/sshd_config +# Configure sshd to listen for v4 and v6 connections sudo sed -i 's/^#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/' $FILESYSTEM_ROOT/etc/ssh/sshd_config +sudo sed -i 's/^#ListenAddress ::/ListenAddress ::/' $FILESYSTEM_ROOT/etc/ssh/sshd_config sudo mkdir -p $FILESYSTEM_ROOT/var/core # Config sysctl sudo augtool --autosave " -set /files/etc/sysctl.conf/kernel.core_pattern '|/usr/bin/coredump-compress %e %t %p' +set /files/etc/sysctl.conf/kernel.core_pattern '|/usr/bin/coredump-compress %e %t %p %P' set /files/etc/sysctl.conf/kernel.softlockup_panic 1 set /files/etc/sysctl.conf/kernel.panic 10 +set /files/etc/sysctl.conf/kernel.panic_on_unrecovered_nmi 1 set /files/etc/sysctl.conf/vm.panic_on_oom 2 set /files/etc/sysctl.conf/fs.suid_dumpable 2 " -r $FILESYSTEM_ROOT @@ -401,7 +404,7 @@ if [[ $CONFIGURED_ARCH == amd64 ]]; then fi ## docker-py is needed by Ansible docker module -sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT easy_install pip +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install --upgrade 'pip==20.3.3' sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install 'docker-py==1.6.0' ## Note: keep pip installed for maintainance purpose @@ -409,6 +412,9 @@ sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install 'docker sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install gcc libpython2.7-dev sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install 'netifaces==0.10.7' +# Install scapy +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install 'scapy==2.4.4' + ## Create /var/run/redis folder for docker-database to mount sudo mkdir -p $FILESYSTEM_ROOT/var/run/redis @@ -466,9 +472,8 @@ if [ "${enable_organization_extensions}" = "y" ]; then fi fi -## Setup ebtable rules (rule file is in binary format) -sudo sed -i 's/EBTABLES_LOAD_ON_START="no"/EBTABLES_LOAD_ON_START="yes"/g' ${FILESYSTEM_ROOT}/etc/default/ebtables -sudo cp files/image_config/ebtables/ebtables.filter ${FILESYSTEM_ROOT}/etc +## Setup ebtable rules (rule file in text format) +sudo cp files/image_config/ebtables/ebtables.filter.cfg ${FILESYSTEM_ROOT}/etc ## Debug Image specific changes ## Update motd for debug image @@ -531,6 +536,13 @@ sudo du -hsx $FILESYSTEM_ROOT sudo mkdir -p $FILESYSTEM_ROOT/var/lib/docker sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -e boot -e var/lib/docker -e $PLATFORM_DIR + +# Ensure admin gid is 1000 +gid_user=$(sudo LANG=C chroot $FILESYSTEM_ROOT id -g $USERNAME) || gid_user="none" +if [ "${gid_user}" != "1000" ]; then + die "expect gid 1000. current:${gid_user}" +fi + ## Compress docker files pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C ${DOCKERFS_PATH}var/lib/docker .; popd diff --git a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile index aec436d2260..9020d35fda2 100755 --- a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile +++ b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td2-as5712-72x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/td2-as5712-72x10G.config.bcm b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/td2-as5712-72x10G.config.bcm index 4844616d038..1d6286ba3bd 100644 --- a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/td2-as5712-72x10G.config.bcm +++ b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/td2-as5712-72x10G.config.bcm @@ -3,7 +3,7 @@ bcm_stat_flags=0 parity_enable=0 parity_correction=0 -bcm_num_cos=8 +bcm_num_cos=10 l2_mem_entries=32768 l3_mem_entries=16384 l3_alpm_enable=2 diff --git a/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/sai.profile b/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/sai.profile index dc4f243953b..3c78aab15dc 100644 --- a/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/sai.profile +++ b/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td2-as5812t-72x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/td2-as5812t-72x10G.config.bcm b/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/td2-as5812t-72x10G.config.bcm index b5555852109..23ccc495bbd 100644 --- a/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/td2-as5812t-72x10G.config.bcm +++ b/device/accton/x86_64-accton_as5812_54t-r0/Accton-AS5812-54T/td2-as5812t-72x10G.config.bcm @@ -1,4 +1,4 @@ -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=0 bcm_stat_interval=2000000 bcm_tunnel_term_compatible_mode=1 diff --git a/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/sai.profile b/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/sai.profile index 063814c1fcb..0ec3aa1896c 100755 --- a/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/sai.profile +++ b/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td2-as5812-72x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/td2-as5812-72x10G.config.bcm b/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/td2-as5812-72x10G.config.bcm index 4844616d038..1d6286ba3bd 100644 --- a/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/td2-as5812-72x10G.config.bcm +++ b/device/accton/x86_64-accton_as5812_54x-r0/Accton-AS5812-54X/td2-as5812-72x10G.config.bcm @@ -3,7 +3,7 @@ bcm_stat_flags=0 parity_enable=0 parity_correction=0 -bcm_num_cos=8 +bcm_num_cos=10 l2_mem_entries=32768 l3_mem_entries=16384 l3_alpm_enable=2 diff --git a/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/sai.profile b/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/sai.profile index 952c87a00ee..e302d007e39 100644 --- a/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/sai.profile +++ b/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/td3-as5835t-48x10G+6x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/td3-as5835t-48x10G+6x100G.config.bcm b/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/td3-as5835t-48x10G+6x100G.config.bcm index 4b73e8c29db..f18e977ef17 100644 --- a/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/td3-as5835t-48x10G+6x100G.config.bcm +++ b/device/accton/x86_64-accton_as5835_54t-r0/Accton-AS5835-54T/td3-as5835t-48x10G+6x100G.config.bcm @@ -18,6 +18,25 @@ l2_mem_entries=32768 #fpem_mem_entries=16384 l2xmsg_mode=1 +# Platform specfic +bcm_num_cos=10 +bcm_stat_interval=2000000 +cdma_timeout_usec=3000000 +ifp_inports_support_enable=1 +ipv6_lpm_128b_enable=0x1 +l3_alpm_enable=2 +l3_max_ecmp_mode=1 +max_vp_lags=0 +miim_intr_enable=0 +module_64ports=1 +port_flex_enable=1 +schan_intr_enable=0 +stable_size=0x5500000 ;Specify the stable cache size in bytes used for Warm boot operations +tdma_timeout_usec=3000000 +skip_L2_USER_ENTRY=0 +bcm_tunnel_term_compatible_mode=1 +l3_alpm_ipv6_128b_bkt_rsvd=1 + #FC0 dport_map_port_1=2 dport_map_port_2=1 diff --git a/device/accton/x86_64-accton_as5835_54x-r0/Accton-AS5835-54X/sai.profile b/device/accton/x86_64-accton_as5835_54x-r0/Accton-AS5835-54X/sai.profile index 8b795f81c4f..744c6571f7c 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/Accton-AS5835-54X/sai.profile +++ b/device/accton/x86_64-accton_as5835_54x-r0/Accton-AS5835-54X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/mv2-as5835-48x10G+6x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as6712_32x-r0/Accton-AS6712-32X/sai.profile b/device/accton/x86_64-accton_as6712_32x-r0/Accton-AS6712-32X/sai.profile index 22432e548b4..6f2a70f146c 100644 --- a/device/accton/x86_64-accton_as6712_32x-r0/Accton-AS6712-32X/sai.profile +++ b/device/accton/x86_64-accton_as6712_32x-r0/Accton-AS6712-32X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td2-as6712-32x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/chassis.py b/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/chassis.py index 6d5ed915812..e737dae1c3c 100644 --- a/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/chassis.py +++ b/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/chassis.py @@ -14,7 +14,7 @@ import json import syslog from sonic_platform_base.chassis_base import ChassisBase - from sonic_daemon_base.daemon_base import Logger + from sonic_py_common.logger import Logger from sonic_platform.fan import Fan from sonic_platform.psu import Psu from sonic_platform.component import Component diff --git a/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/sfp.py b/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/sfp.py index be1dbb52a79..5033c2adf9c 100644 --- a/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/sfp.py +++ b/device/accton/x86_64-accton_as7116_54x-r0/sonic_platform/sfp.py @@ -8,7 +8,6 @@ import os import time import subprocess - import sonic_device_util import syslog from ctypes import create_string_buffer from sonic_platform_base.sfp_base import SfpBase @@ -18,7 +17,7 @@ from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper - from sonic_daemon_base.daemon_base import Logger + from sonic_py_common.logger import Logger except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -195,7 +194,7 @@ def __init__(self, sfp_index, sfp_type): self.port_to_eeprom_mapping[p_num] = eeprom_path.format( self.port_to_i2c_mapping[p_num]) - self.info_dict_keys = ['type', 'hardwarerev', 'serialnum', 'manufacturename', 'modelname', 'Connector', 'encoding', 'ext_identifier', + self.info_dict_keys = ['type', 'hardware_rev', 'serial', 'manufacturer', 'model', 'connector', 'encoding', 'ext_identifier', 'ext_rateselect_compliance', 'cable_type', 'cable_length', 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui'] self.dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', 'power_lpmode', 'tx_disable', 'tx_disable_channel', 'temperature', 'voltage', @@ -308,11 +307,11 @@ def get_sfp_transceiver_info(self): keys |Value Format |Information ---------------------------|---------------|---------------------------- type |1*255VCHAR |type of SFP - hardwarerev |1*255VCHAR |hardware version of SFP - serialnum |1*255VCHAR |serial number of the SFP - manufacturename |1*255VCHAR |SFP vendor name - modelname |1*255VCHAR |SFP model name - Connector |1*255VCHAR |connector information + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information encoding |1*255VCHAR |encoding information ext_identifier |1*255VCHAR |extend identifier ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance @@ -371,17 +370,17 @@ def get_sfp_transceiver_info(self): if sfp_interface_bulk_data: transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] - transceiver_info_dict['Connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data[ + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data[ 'data']['Vendor Name']['value'] if sfp_vendor_name_data else 'N/A' - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] if sfp_vendor_oui_data else 'N/A' transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' @@ -562,11 +561,11 @@ def get_qsfp_transceiver_info(self): keys |Value Format |Information ---------------------------|---------------|---------------------------- type |1*255VCHAR |type of SFP - hardwarerev |1*255VCHAR |hardware version of SFP - serialnum |1*255VCHAR |serial number of the SFP - manufacturename |1*255VCHAR |SFP vendor name - modelname |1*255VCHAR |SFP model name - Connector |1*255VCHAR |connector information + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information encoding |1*255VCHAR |encoding information ext_identifier |1*255VCHAR |extend identifier ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance @@ -625,17 +624,17 @@ def get_qsfp_transceiver_info(self): if sfp_interface_bulk_data: transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] - transceiver_info_dict['Connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data[ + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data[ 'data']['Vendor Name']['value'] if sfp_vendor_name_data else 'N/A' - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] if sfp_vendor_oui_data else 'N/A' transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' @@ -1121,7 +1120,7 @@ def get_model(self): string: Model/part number of device """ transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("modelname", "N/A") + return transceiver_dom_info_dict.get("model", "N/A") def get_serial(self): """ @@ -1130,4 +1129,4 @@ def get_serial(self): string: Serial number of device """ transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("serialnum", "N/A") + return transceiver_dom_info_dict.get("serial", "N/A") diff --git a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile index 31aefe2c290..54cdc34801d 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile +++ b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-as7312-48x25G+6x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7312_54xs-r0/Accton-AS7312-54XS/sai.profile b/device/accton/x86_64-accton_as7312_54xs-r0/Accton-AS7312-54XS/sai.profile index 31aefe2c290..54cdc34801d 100644 --- a/device/accton/x86_64-accton_as7312_54xs-r0/Accton-AS7312-54XS/sai.profile +++ b/device/accton/x86_64-accton_as7312_54xs-r0/Accton-AS7312-54XS/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-as7312-48x25G+6x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7315_27xb-r0/Accton-AS7315-27XB/sai.profile b/device/accton/x86_64-accton_as7315_27xb-r0/Accton-AS7315-27XB/sai.profile index 191b27dac2f..551599b5eba 100644 --- a/device/accton/x86_64-accton_as7315_27xb-r0/Accton-AS7315-27XB/sai.profile +++ b/device/accton/x86_64-accton_as7315_27xb-r0/Accton-AS7315-27XB/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/qax-as7315-20x10G+4x25G+3x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile index 47e3107477a..eb932199dfa 100755 --- a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile +++ b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-as7326-48x25G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm index 1a4b7da32df..83f614bf093 100755 --- a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm +++ b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm @@ -14,7 +14,7 @@ fpem_mem_entries=16384 l2xmsg_mode=1 # Platform specfic -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 ifp_inports_support_enable=1 diff --git a/device/accton/x86_64-accton_as7326_56x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7326_56x-r0/plugins/sfputil.py index 0292e2d52e1..86a77c91c48 100644 --- a/device/accton/x86_64-accton_as7326_56x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7326_56x-r0/plugins/sfputil.py @@ -47,16 +47,16 @@ class SfpUtil(SfpUtilBase): 8: 50, 9: 48, 10: 49, - 11: 51, - 12: 52, + 11: 52, + 12: 51, 13: 53, 14: 56, 15: 55, 16: 54, 17: 58, 18: 57, - 19: 59, - 20: 60, + 19: 60, + 20: 59, 21: 61, 22: 63, 23: 62, diff --git a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile index 28953a08f20..6e4d11fb729 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile +++ b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-as7712-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/th-as7712-32x100G.config.bcm b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/th-as7712-32x100G.config.bcm index 09d97c5e4c6..6ecca8e02a0 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/th-as7712-32x100G.config.bcm +++ b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/th-as7712-32x100G.config.bcm @@ -14,7 +14,7 @@ pbmp_xport_xe=0x444444451111111144444444422222222 # arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile index 65944732653..794c15a5c95 100644 --- a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile +++ b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-as7716-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/th-as7716-32x100G.config.bcm b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/th-as7716-32x100G.config.bcm index 1231bf302be..1aa9f5d2c16 100644 --- a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/th-as7716-32x100G.config.bcm +++ b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/th-as7716-32x100G.config.bcm @@ -14,7 +14,7 @@ pbmp_xport_xe=0x444444451111111144444444422222222 # arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/sai.profile b/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/sai.profile index 65944732653..794c15a5c95 100755 --- a/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/sai.profile +++ b/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-as7716-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/th-as7716-32x100G.config.bcm b/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/th-as7716-32x100G.config.bcm index 1231bf302be..1aa9f5d2c16 100644 --- a/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/th-as7716-32x100G.config.bcm +++ b/device/accton/x86_64-accton_as7716_32xb-r0/Accton-AS7716-32XB/th-as7716-32x100G.config.bcm @@ -14,7 +14,7 @@ pbmp_xport_xe=0x444444451111111144444444422222222 # arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile index 46f5cb3bf85..25c1011458a 100644 --- a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile +++ b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/td3-as7726-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm index 16cbb8d341e..e06099825a8 100755 --- a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm +++ b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm @@ -15,7 +15,7 @@ fpem_mem_entries=131072 l2xmsg_mode=1 # Platform specfic -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 ipv6_lpm_128b_enable=0x1 diff --git a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/sai.profile b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/sai.profile index e2f945e9a07..e4a68ce337e 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/sai.profile +++ b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-as7816-64x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/th2-as7816-64x100G.config.bcm b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/th2-as7816-64x100G.config.bcm index 2a440fbfe07..88e386403e4 100644 --- a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/th2-as7816-64x100G.config.bcm +++ b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/th2-as7816-64x100G.config.bcm @@ -14,7 +14,7 @@ pbmp_oversubscribe=0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff # platform specific setting arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile b/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile index be39b1f961f..c1cc49199ae 100644 --- a/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile +++ b/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/th3-as9716-32x400G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/Alphanetworks-SNH60A0-320FV2/sai.profile b/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/Alphanetworks-SNH60A0-320FV2/sai.profile index b6e792ad0a1..66d99a8450c 100644 --- a/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/Alphanetworks-SNH60A0-320FV2/sai.profile +++ b/device/alphanetworks/x86_64-alphanetworks_snh60a0_320fv2-r0/Alphanetworks-SNH60A0-320FV2/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-snh60a0-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/Alphanetworks-SNH60B0-640F/sai.profile b/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/Alphanetworks-SNH60B0-640F/sai.profile index 04555733c02..0abb91695d5 100644 --- a/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/Alphanetworks-SNH60B0-640F/sai.profile +++ b/device/alphanetworks/x86_64-alphanetworks_snh60b0_640f-r0/Alphanetworks-SNH60B0-640F/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-snh60b0-64x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/td2-a7050-qx32-16x40G+32x10G+8x40G.config.bcm b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/td2-a7050-qx32-16x40G+32x10G+8x40G.config.bcm index 4ce6b2d4a9d..d3ee2d5e3b0 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/td2-a7050-qx32-16x40G+32x10G+8x40G.config.bcm +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/td2-a7050-qx32-16x40G+32x10G+8x40G.config.bcm @@ -37,7 +37,7 @@ stat_if_parity_enable=0 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 lls_num_l2uc=12 max_vp_lags=0 diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/td2-a7050-qx32-32x40G.config.bcm b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/td2-a7050-qx32-32x40G.config.bcm index 76b1af3aba1..7537b36411f 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/td2-a7050-qx32-32x40G.config.bcm +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/td2-a7050-qx32-32x40G.config.bcm @@ -37,7 +37,7 @@ stat_if_parity_enable=0 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 lls_num_l2uc=12 max_vp_lags=0 diff --git a/device/arista/x86_64-arista_7050_qx32/pmon_daemon_control.json b/device/arista/x86_64-arista_7050_qx32/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7050_qx32/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7050_qx32/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050_qx32/thermal_policy.json b/device/arista/x86_64-arista_7050_qx32/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S new file mode 120000 index 00000000000..16c96007892 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S @@ -0,0 +1 @@ +Arista-7050QX-32S-S4Q31 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..d93aa34893d --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/buffers_defaults_t0.j2 @@ -0,0 +1,49 @@ +{%- set default_cable = '300m' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {% if PORT_ALL.append("Ethernet0") %}{% endif %} + {% if PORT_ALL.append("Ethernet1") %}{% endif %} + {% if PORT_ALL.append("Ethernet2") %}{% endif %} + {% if PORT_ALL.append("Ethernet3") %}{% endif %} + {% for port_idx in range(1,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 %} diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/buffers_defaults_t1.j2 index f72e3eb06fb..d93aa34893d 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/buffers_defaults_t1.j2 +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/buffers_defaults_t1.j2 @@ -24,7 +24,7 @@ "mode": "static" }, "egress_lossy_pool": { - "size": "8072396", + "size": "7326924", "type": "egress", "mode": "dynamic" } diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/pg_profile_lookup.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/pg_profile_lookup.ini index f961fd33b13..73e663a85e3 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/pg_profile_lookup.ini +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/pg_profile_lookup.ini @@ -1,14 +1,17 @@ # PG lossless profiles. # speed cable size xon xoff threshold xon_offset - 10000 5m 41808 18432 40560 -4 2496 - 40000 5m 41808 18432 40560 -4 2496 - 50000 5m 41808 18432 40560 -4 2496 - 100000 5m 41808 18432 40560 -4 2496 - 10000 40m 41808 18432 40560 -4 2496 - 40000 40m 41808 18432 40560 -4 2496 - 50000 40m 41808 18432 40560 -4 2496 - 100000 40m 41808 18432 40560 -4 2496 - 10000 300m 41808 18432 40560 -4 2496 - 40000 300m 41808 18432 40560 -4 2496 - 50000 300m 41808 18432 40560 -4 2496 - 100000 300m 41808 18432 40560 -4 2496 + 1000 5m 41808 18432 40560 -3 2496 + 10000 5m 41808 18432 40560 -3 2496 + 40000 5m 56368 18432 55120 -3 2496 + 50000 5m 56368 18432 55120 -3 2496 + 100000 5m 56368 18432 55120 -3 2496 + 1000 40m 41808 18432 40560 -3 2496 + 10000 40m 41808 18432 40560 -3 2496 + 40000 40m 56368 18432 55120 -3 2496 + 50000 40m 56368 18432 55120 -3 2496 + 100000 40m 56368 18432 55120 -3 2496 + 1000 300m 41808 18432 40560 -3 2496 + 10000 300m 41808 18432 40560 -3 2496 + 40000 300m 56368 18432 55120 -3 2496 + 50000 300m 56368 18432 55120 -3 2496 + 100000 300m 56368 18432 55120 -3 2496 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/qos.json.j2 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/qos.json.j2 index 1accac3ddd0..3e548325ea3 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/qos.json.j2 +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/qos.json.j2 @@ -1,148 +1 @@ -{ - "TC_TO_PRIORITY_GROUP_MAP": { - "AZURE": { - "0": "0", - "1": "1", - "3": "3", - "4": "4" - } - }, - "MAP_PFC_PRIORITY_TO_QUEUE": { - "AZURE": { - "0": "0", - "1": "1", - "3": "3", - "4": "4" - } - }, - "TC_TO_QUEUE_MAP": { - "AZURE": { - "0": "0", - "1": "1", - "3": "3", - "4": "4" - } - }, - "DSCP_TO_TC_MAP": { - "AZURE": { - "0":"0", - "1":"0", - "2":"0", - "3":"3", - "4":"4", - "5":"0", - "6":"0", - "7":"0", - "8":"1", - "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": "25" - }, - "scheduler.1" : { - "type":"DWRR", - "weight": "30" - }, - "scheduler.2" : { - "type":"DWRR", - "weight": "20" - } - }, - "PORT_QOS_MAP": { - "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { - "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", - "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", - "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", - "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", - "pfc_enable": "3,4" - } - }, - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable":"true", - "wred_yellow_enable":"true", - "wred_red_enable":"true", - "ecn":"ecn_all", - "red_max_threshold":"312000", - "red_min_threshold":"104000", - "yellow_max_threshold":"312000", - "yellow_min_threshold":"104000", - "green_max_threshold":"312000", - "green_min_threshold":"104000" - } - }, - "QUEUE": { - "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4" : { - "scheduler" : "[SCHEDULER|scheduler.0]" - }, - "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3" : { - "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" - }, - "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|4" : { - "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" - }, - "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0" : { - "scheduler" : "[SCHEDULER|scheduler.1]" - }, - "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1" : { - "scheduler" : "[SCHEDULER|scheduler.2]" - } - } -} +{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/sai.profile b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/sai.profile index 9a50433cabd..0be2fc5e0f4 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/sai.profile +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td2-a7050-q31s4-31x40G-4x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/td2-a7050-q31s4-31x40G-4x10G.config.bcm b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/td2-a7050-q31s4-31x40G-4x10G.config.bcm index 4819c7929ec..c5666bbc745 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/td2-a7050-q31s4-31x40G-4x10G.config.bcm +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX-32S-S4Q31/td2-a7050-q31s4-31x40G-4x10G.config.bcm @@ -1,17 +1,51 @@ +# 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 + +# l2 thread related config vars +l2xmsg_hostbuf_size=8192 +l2xmsg_mode=1 + +bcm_num_cos=8 +bcm_stat_interval=2000000 +lls_num_l2uc=12 +max_vp_lags=0 +miim_intr_enable=0 +mmu_lossless=0 +module_64ports=0 + +stable_size=0x2000000 + +tdma_timeout_usec=5000000 +tslam_timeout_usec=15000000 +cdma_timeout_usec=15000000 +dma_desc_timeout_usec=15000000 + +############################### +serdes_fiber_pref=1 +############################### +mdio_output_delay=0x0d +############################### +xgxs_lcpll_xtal_refclk=1 +tdma_intr_enable=1 +tslam_intr_enable=1 +table_dma_enable=1 + arl_clean_timeout_usec=15000000 -bcm_num_cos.0=8 bcm_stat_flags=1 bcm_stat_jumbo.0=9236 -cdma_timeout_usec.0=15000000 -dma_desc_timeout_usec.0=15000000 -higig2_hdr_mode.0=1 -ipv6_lpm_128b_enable.0=2 -l2xmsg_mode.0=1 -max_vp_lags.0=0 -mdio_output_delay=0x0d -miim_intr_enable.0=0 -module_64ports.0=0 -os=unix + pbmp_oversubscribe.0=0x1fffffffffffffffffffffffffe pbmp_xport_xe.0=0x1fffffffffffffffffffffffffe phy_an_c37_1.0=3 @@ -243,10 +277,6 @@ serdes_firmware_mode_101.0=2 serdes_firmware_mode_102.0=2 serdes_firmware_mode_103.0=2 serdes_firmware_mode_104.0=2 -stable_size=0x2000000 -tdma_timeout_usec.0=15000000 -tslam_timeout_usec.0=15000000 -xgxs_lcpll_xtal_refclk.0=1 xgxs_rx_lane_map_1.0=0x3210 xgxs_rx_lane_map_5.0=0x0321 xgxs_rx_lane_map_9.0=0x1302 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32 deleted file mode 120000 index 6a90d8a3ac7..00000000000 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32 +++ /dev/null @@ -1 +0,0 @@ -Arista-7050-QX-32S \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/buffers.json.j2 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/buffers.json.j2 similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/buffers.json.j2 rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/buffers.json.j2 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/buffers_defaults_t0.j2 similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/buffers_defaults_t0.j2 rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/buffers_defaults_t0.j2 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/buffers_defaults_t1.j2 similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/buffers_defaults_t1.j2 rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/buffers_defaults_t1.j2 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/hwsku-init b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/hwsku-init similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/hwsku-init rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/hwsku-init diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/pg_profile_lookup.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/pg_profile_lookup.ini similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/pg_profile_lookup.ini rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/pg_profile_lookup.ini diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/port_config.ini similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/port_config.ini diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/qos.json.j2 b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/qos.json.j2 similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/qos.json.j2 rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/qos.json.j2 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/sai.profile b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/sai.profile similarity index 76% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/sai.profile rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/sai.profile index 6479c4c14d3..cbaa8cdfd51 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/sai.profile +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td2-a7050-qx32s-32x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/td2-a7050-qx32s-32x40G.config.bcm b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/td2-a7050-qx32s-32x40G.config.bcm similarity index 99% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/td2-a7050-qx32s-32x40G.config.bcm rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/td2-a7050-qx32s-32x40G.config.bcm index 3b1a4514409..31521e4c43a 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/td2-a7050-qx32s-32x40G.config.bcm +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050QX32S-Q32/td2-a7050-qx32s-32x40G.config.bcm @@ -31,7 +31,7 @@ stat_if_parity_enable=0 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 lls_num_l2uc=12 max_vp_lags=0 diff --git a/device/arista/x86_64-arista_7050_qx32s/pmon_daemon_control.json b/device/arista/x86_64-arista_7050_qx32s/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7050_qx32s/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7050_qx32s/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050_qx32s/thermal_policy.json b/device/arista/x86_64-arista_7050_qx32s/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile index d359ffc15cb..7d96f190de7 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-a7050cx3-32s-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm index e66e2e98416..09354d6fd8e 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm @@ -1,6 +1,6 @@ arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 bcm_tunnel_term_compatible_mode=1 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/port_config.ini b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/port_config.ini new file mode 100644 index 00000000000..25670f87d9c --- /dev/null +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/port_config.ini @@ -0,0 +1,57 @@ +# name lanes alias index speed +Ethernet0 1,2 Ethernet1/1 1 50000 +Ethernet2 3,4 Ethernet1/3 1 50000 +Ethernet4 5,6 Ethernet2/1 2 50000 +Ethernet6 7,8 Ethernet2/3 2 50000 +Ethernet8 9,10 Ethernet3/1 3 50000 +Ethernet10 11,12 Ethernet3/3 3 50000 +Ethernet12 13,14 Ethernet4/1 4 50000 +Ethernet14 15,16 Ethernet4/3 4 50000 +Ethernet16 21,22 Ethernet5/1 5 50000 +Ethernet18 23,24 Ethernet5/3 5 50000 +Ethernet20 17,18 Ethernet6/1 6 50000 +Ethernet22 19,20 Ethernet6/3 6 50000 +Ethernet24 25,26,27,28 Ethernet7/1 7 100000 +Ethernet28 29,30,31,32 Ethernet8/1 8 100000 +Ethernet32 37,38,39,40 Ethernet9/1 9 100000 +Ethernet36 33,34,35,36 Ethernet10/1 10 100000 +Ethernet40 41,42 Ethernet11/1 11 50000 +Ethernet42 43,44 Ethernet11/3 11 50000 +Ethernet44 45,46 Ethernet12/1 12 50000 +Ethernet46 47,48 Ethernet12/3 12 50000 +Ethernet48 53,54 Ethernet13/1 13 50000 +Ethernet50 55,56 Ethernet13/3 13 50000 +Ethernet52 49,50 Ethernet14/1 14 50000 +Ethernet54 51,52 Ethernet14/3 14 50000 +Ethernet56 57,58 Ethernet15/1 15 50000 +Ethernet58 59,60 Ethernet15/3 15 50000 +Ethernet60 61,62 Ethernet16/1 16 50000 +Ethernet62 63,64 Ethernet16/3 16 50000 +Ethernet64 69,70 Ethernet17/1 17 50000 +Ethernet66 71,72 Ethernet17/3 17 50000 +Ethernet68 65,66 Ethernet18/1 18 50000 +Ethernet70 67,68 Ethernet18/3 18 50000 +Ethernet72 73,74 Ethernet19/1 19 50000 +Ethernet74 75,76 Ethernet19/3 19 50000 +Ethernet76 77,78 Ethernet20/1 20 50000 +Ethernet78 79,80 Ethernet20/3 20 50000 +Ethernet80 85,86 Ethernet21/1 21 50000 +Ethernet82 87,88 Ethernet21/3 21 50000 +Ethernet84 81,82 Ethernet22/1 22 50000 +Ethernet86 83,84 Ethernet22/3 22 50000 +Ethernet88 89,90,91,92 Ethernet23/1 23 100000 +Ethernet92 93,94,95,96 Ethernet24/1 24 100000 +Ethernet96 101,102,103,104 Ethernet25/1 25 100000 +Ethernet100 97,98,99,100 Ethernet26/1 26 100000 +Ethernet104 105,106 Ethernet27/1 27 50000 +Ethernet106 107,108 Ethernet27/3 27 50000 +Ethernet108 109,110 Ethernet28/1 28 50000 +Ethernet110 111,112 Ethernet28/3 28 50000 +Ethernet112 117,118 Ethernet29/1 29 50000 +Ethernet114 119,120 Ethernet29/3 29 50000 +Ethernet116 113,114 Ethernet30/1 30 50000 +Ethernet118 115,116 Ethernet30/3 30 50000 +Ethernet120 121,122 Ethernet31/1 31 50000 +Ethernet122 123,124 Ethernet31/3 31 50000 +Ethernet124 125,126 Ethernet32/1 32 50000 +Ethernet126 127,128 Ethernet32/3 32 50000 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/sai.profile b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/sai.profile new file mode 100644 index 00000000000..1865041f8d9 --- /dev/null +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-a7050cx3-32s-48x50G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm new file mode 100644 index 00000000000..2b7da96358d --- /dev/null +++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-D48C8/td3-a7050cx3-32s-48x50G+8x100G.config.bcm @@ -0,0 +1,545 @@ +arl_clean_timeout_usec=15000000 +asf_mem_profile=2 +bcm_num_cos=8 +bcm_stat_flags=1 +bcm_stat_jumbo=9236 +bcm_tunnel_term_compatible_mode=1 +cdma_timeout_usec=15000000 +core_clock_frequency=1525 +dma_desc_timeout_usec=15000000 +dpp_clock_ratio=2:3 +fpem_mem_entries=0 +higig2_hdr_mode=1 +ifp_inports_support_enable=1 +ipv6_lpm_128b_enable=1 +l2_mem_entries=32768 +l2xmsg_mode=1 +l3_alpm_enable=2 +l3_max_ecmp_mode=1 +l3_mem_entries=16384 +max_vp_lags=0 +miim_intr_enable=0 +module_64ports=1 +multicast_l2_range=16383 +multicast_l3_range=0 +os=unix +oversubscribe_mode=1 +pbmp_xport_xe=0x7ffffffffffffffffffffffffffffffffe +PHY_AN_ALLOW_PLL_CHANGE=1 +phy_an_c37_130=2 +phy_an_c37_66=2 +phy_an_c73=1 +port_flex_enable=1 +port_init_autoneg=0 +port_phy_addr=0xff +robust_hash_disable_egress_vlan=1 +robust_hash_disable_mpls=1 +robust_hash_disable_vlan=1 +stable_size=0x5500000 +tdma_timeout_usec=15000000 +tslam_timeout_usec=15000000 +phy_chain_rx_lane_map_physical{1.0}=0x1302 +phy_chain_rx_lane_map_physical{5.0}=0x3120 +phy_chain_rx_lane_map_physical{9.0}=0x3120 +phy_chain_rx_lane_map_physical{13.0}=0x3120 +phy_chain_rx_lane_map_physical{17.0}=0x1203 +phy_chain_rx_lane_map_physical{21.0}=0x3120 +phy_chain_rx_lane_map_physical{25.0}=0x3120 +phy_chain_rx_lane_map_physical{29.0}=0x3120 +phy_chain_rx_lane_map_physical{33.0}=0x1203 +phy_chain_rx_lane_map_physical{37.0}=0x3120 +phy_chain_rx_lane_map_physical{41.0}=0x3120 +phy_chain_rx_lane_map_physical{45.0}=0x3120 +phy_chain_rx_lane_map_physical{49.0}=0x1203 +phy_chain_rx_lane_map_physical{53.0}=0x3120 +phy_chain_rx_lane_map_physical{57.0}=0x3120 +phy_chain_rx_lane_map_physical{61.0}=0x3120 +phy_chain_rx_lane_map_physical{65.0}=0x2130 +phy_chain_rx_lane_map_physical{69.0}=0x0213 +phy_chain_rx_lane_map_physical{73.0}=0x2031 +phy_chain_rx_lane_map_physical{77.0}=0x0213 +phy_chain_rx_lane_map_physical{81.0}=0x2130 +phy_chain_rx_lane_map_physical{85.0}=0x0213 +phy_chain_rx_lane_map_physical{89.0}=0x2031 +phy_chain_rx_lane_map_physical{93.0}=0x0213 +phy_chain_rx_lane_map_physical{97.0}=0x2130 +phy_chain_rx_lane_map_physical{101.0}=0x0213 +phy_chain_rx_lane_map_physical{105.0}=0x2031 +phy_chain_rx_lane_map_physical{109.0}=0x0213 +phy_chain_rx_lane_map_physical{113.0}=0x2130 +phy_chain_rx_lane_map_physical{117.0}=0x0213 +phy_chain_rx_lane_map_physical{121.0}=0x2031 +phy_chain_rx_lane_map_physical{125.0}=0x0213 +phy_chain_rx_lane_map_physical{129.0}=0x3210 +phy_chain_rx_polarity_flip_physical{1.0}=0x0 +phy_chain_rx_polarity_flip_physical{2.0}=0x0 +phy_chain_rx_polarity_flip_physical{3.0}=0x0 +phy_chain_rx_polarity_flip_physical{4.0}=0x1 +phy_chain_rx_polarity_flip_physical{5.0}=0x0 +phy_chain_rx_polarity_flip_physical{6.0}=0x1 +phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_rx_polarity_flip_physical{8.0}=0x0 +phy_chain_rx_polarity_flip_physical{9.0}=0x0 +phy_chain_rx_polarity_flip_physical{10.0}=0x0 +phy_chain_rx_polarity_flip_physical{11.0}=0x1 +phy_chain_rx_polarity_flip_physical{12.0}=0x1 +phy_chain_rx_polarity_flip_physical{13.0}=0x1 +phy_chain_rx_polarity_flip_physical{14.0}=0x1 +phy_chain_rx_polarity_flip_physical{15.0}=0x0 +phy_chain_rx_polarity_flip_physical{16.0}=0x0 +phy_chain_rx_polarity_flip_physical{17.0}=0x0 +phy_chain_rx_polarity_flip_physical{18.0}=0x0 +phy_chain_rx_polarity_flip_physical{19.0}=0x1 +phy_chain_rx_polarity_flip_physical{20.0}=0x0 +phy_chain_rx_polarity_flip_physical{21.0}=0x1 +phy_chain_rx_polarity_flip_physical{22.0}=0x1 +phy_chain_rx_polarity_flip_physical{23.0}=0x0 +phy_chain_rx_polarity_flip_physical{24.0}=0x0 +phy_chain_rx_polarity_flip_physical{25.0}=0x0 +phy_chain_rx_polarity_flip_physical{26.0}=0x1 +phy_chain_rx_polarity_flip_physical{27.0}=0x1 +phy_chain_rx_polarity_flip_physical{28.0}=0x0 +phy_chain_rx_polarity_flip_physical{29.0}=0x1 +phy_chain_rx_polarity_flip_physical{30.0}=0x1 +phy_chain_rx_polarity_flip_physical{31.0}=0x0 +phy_chain_rx_polarity_flip_physical{32.0}=0x0 +phy_chain_rx_polarity_flip_physical{33.0}=0x0 +phy_chain_rx_polarity_flip_physical{34.0}=0x0 +phy_chain_rx_polarity_flip_physical{35.0}=0x1 +phy_chain_rx_polarity_flip_physical{36.0}=0x0 +phy_chain_rx_polarity_flip_physical{37.0}=0x1 +phy_chain_rx_polarity_flip_physical{38.0}=0x1 +phy_chain_rx_polarity_flip_physical{39.0}=0x0 +phy_chain_rx_polarity_flip_physical{40.0}=0x0 +phy_chain_rx_polarity_flip_physical{41.0}=0x0 +phy_chain_rx_polarity_flip_physical{42.0}=0x0 +phy_chain_rx_polarity_flip_physical{43.0}=0x1 +phy_chain_rx_polarity_flip_physical{44.0}=0x1 +phy_chain_rx_polarity_flip_physical{45.0}=0x1 +phy_chain_rx_polarity_flip_physical{46.0}=0x1 +phy_chain_rx_polarity_flip_physical{47.0}=0x0 +phy_chain_rx_polarity_flip_physical{48.0}=0x0 +phy_chain_rx_polarity_flip_physical{49.0}=0x0 +phy_chain_rx_polarity_flip_physical{50.0}=0x0 +phy_chain_rx_polarity_flip_physical{51.0}=0x1 +phy_chain_rx_polarity_flip_physical{52.0}=0x0 +phy_chain_rx_polarity_flip_physical{53.0}=0x1 +phy_chain_rx_polarity_flip_physical{54.0}=0x1 +phy_chain_rx_polarity_flip_physical{55.0}=0x0 +phy_chain_rx_polarity_flip_physical{56.0}=0x0 +phy_chain_rx_polarity_flip_physical{57.0}=0x0 +phy_chain_rx_polarity_flip_physical{58.0}=0x0 +phy_chain_rx_polarity_flip_physical{59.0}=0x1 +phy_chain_rx_polarity_flip_physical{60.0}=0x1 +phy_chain_rx_polarity_flip_physical{61.0}=0x1 +phy_chain_rx_polarity_flip_physical{62.0}=0x1 +phy_chain_rx_polarity_flip_physical{63.0}=0x0 +phy_chain_rx_polarity_flip_physical{64.0}=0x0 +phy_chain_rx_polarity_flip_physical{65.0}=0x1 +phy_chain_rx_polarity_flip_physical{66.0}=0x1 +phy_chain_rx_polarity_flip_physical{67.0}=0x0 +phy_chain_rx_polarity_flip_physical{68.0}=0x1 +phy_chain_rx_polarity_flip_physical{69.0}=0x0 +phy_chain_rx_polarity_flip_physical{70.0}=0x0 +phy_chain_rx_polarity_flip_physical{71.0}=0x1 +phy_chain_rx_polarity_flip_physical{72.0}=0x1 +phy_chain_rx_polarity_flip_physical{73.0}=0x1 +phy_chain_rx_polarity_flip_physical{74.0}=0x1 +phy_chain_rx_polarity_flip_physical{75.0}=0x1 +phy_chain_rx_polarity_flip_physical{76.0}=0x0 +phy_chain_rx_polarity_flip_physical{77.0}=0x0 +phy_chain_rx_polarity_flip_physical{78.0}=0x0 +phy_chain_rx_polarity_flip_physical{79.0}=0x1 +phy_chain_rx_polarity_flip_physical{80.0}=0x1 +phy_chain_rx_polarity_flip_physical{81.0}=0x1 +phy_chain_rx_polarity_flip_physical{82.0}=0x1 +phy_chain_rx_polarity_flip_physical{83.0}=0x0 +phy_chain_rx_polarity_flip_physical{84.0}=0x1 +phy_chain_rx_polarity_flip_physical{85.0}=0x0 +phy_chain_rx_polarity_flip_physical{86.0}=0x0 +phy_chain_rx_polarity_flip_physical{87.0}=0x1 +phy_chain_rx_polarity_flip_physical{88.0}=0x1 +phy_chain_rx_polarity_flip_physical{89.0}=0x1 +phy_chain_rx_polarity_flip_physical{90.0}=0x1 +phy_chain_rx_polarity_flip_physical{91.0}=0x1 +phy_chain_rx_polarity_flip_physical{92.0}=0x0 +phy_chain_rx_polarity_flip_physical{93.0}=0x0 +phy_chain_rx_polarity_flip_physical{94.0}=0x0 +phy_chain_rx_polarity_flip_physical{95.0}=0x1 +phy_chain_rx_polarity_flip_physical{96.0}=0x1 +phy_chain_rx_polarity_flip_physical{97.0}=0x1 +phy_chain_rx_polarity_flip_physical{98.0}=0x1 +phy_chain_rx_polarity_flip_physical{99.0}=0x0 +phy_chain_rx_polarity_flip_physical{100.0}=0x1 +phy_chain_rx_polarity_flip_physical{101.0}=0x1 +phy_chain_rx_polarity_flip_physical{102.0}=0x0 +phy_chain_rx_polarity_flip_physical{103.0}=0x0 +phy_chain_rx_polarity_flip_physical{104.0}=0x1 +phy_chain_rx_polarity_flip_physical{105.0}=0x1 +phy_chain_rx_polarity_flip_physical{106.0}=0x1 +phy_chain_rx_polarity_flip_physical{107.0}=0x1 +phy_chain_rx_polarity_flip_physical{108.0}=0x0 +phy_chain_rx_polarity_flip_physical{109.0}=0x0 +phy_chain_rx_polarity_flip_physical{110.0}=0x0 +phy_chain_rx_polarity_flip_physical{111.0}=0x1 +phy_chain_rx_polarity_flip_physical{112.0}=0x1 +phy_chain_rx_polarity_flip_physical{113.0}=0x1 +phy_chain_rx_polarity_flip_physical{114.0}=0x1 +phy_chain_rx_polarity_flip_physical{115.0}=0x0 +phy_chain_rx_polarity_flip_physical{116.0}=0x1 +phy_chain_rx_polarity_flip_physical{117.0}=0x0 +phy_chain_rx_polarity_flip_physical{118.0}=0x0 +phy_chain_rx_polarity_flip_physical{119.0}=0x1 +phy_chain_rx_polarity_flip_physical{120.0}=0x1 +phy_chain_rx_polarity_flip_physical{121.0}=0x1 +phy_chain_rx_polarity_flip_physical{122.0}=0x1 +phy_chain_rx_polarity_flip_physical{123.0}=0x1 +phy_chain_rx_polarity_flip_physical{124.0}=0x0 +phy_chain_rx_polarity_flip_physical{125.0}=0x0 +phy_chain_rx_polarity_flip_physical{126.0}=0x0 +phy_chain_rx_polarity_flip_physical{127.0}=0x1 +phy_chain_rx_polarity_flip_physical{128.0}=0x1 +phy_chain_rx_polarity_flip_physical{129.0}=0x0 +phy_chain_rx_polarity_flip_physical{131.0}=0x0 +phy_chain_tx_lane_map_physical{1.0}=0x3021 +phy_chain_tx_lane_map_physical{5.0}=0x1203 +phy_chain_tx_lane_map_physical{9.0}=0x0213 +phy_chain_tx_lane_map_physical{13.0}=0x0213 +phy_chain_tx_lane_map_physical{17.0}=0x2031 +phy_chain_tx_lane_map_physical{21.0}=0x0213 +phy_chain_tx_lane_map_physical{25.0}=0x2031 +phy_chain_tx_lane_map_physical{29.0}=0x1203 +phy_chain_tx_lane_map_physical{33.0}=0x2031 +phy_chain_tx_lane_map_physical{37.0}=0x0213 +phy_chain_tx_lane_map_physical{41.0}=0x2031 +phy_chain_tx_lane_map_physical{45.0}=0x1203 +phy_chain_tx_lane_map_physical{49.0}=0x2031 +phy_chain_tx_lane_map_physical{53.0}=0x0213 +phy_chain_tx_lane_map_physical{57.0}=0x2031 +phy_chain_tx_lane_map_physical{61.0}=0x1203 +phy_chain_tx_lane_map_physical{65.0}=0x1302 +phy_chain_tx_lane_map_physical{69.0}=0x1302 +phy_chain_tx_lane_map_physical{73.0}=0x1302 +phy_chain_tx_lane_map_physical{77.0}=0x2130 +phy_chain_tx_lane_map_physical{81.0}=0x1302 +phy_chain_tx_lane_map_physical{85.0}=0x3120 +phy_chain_tx_lane_map_physical{89.0}=0x1302 +phy_chain_tx_lane_map_physical{93.0}=0x2130 +phy_chain_tx_lane_map_physical{97.0}=0x1302 +phy_chain_tx_lane_map_physical{101.0}=0x3120 +phy_chain_tx_lane_map_physical{105.0}=0x1302 +phy_chain_tx_lane_map_physical{109.0}=0x2130 +phy_chain_tx_lane_map_physical{113.0}=0x1302 +phy_chain_tx_lane_map_physical{117.0}=0x3120 +phy_chain_tx_lane_map_physical{121.0}=0x1302 +phy_chain_tx_lane_map_physical{125.0}=0x3120 +phy_chain_tx_lane_map_physical{129.0}=0x3210 +phy_chain_tx_polarity_flip_physical{1.0}=0x1 +phy_chain_tx_polarity_flip_physical{2.0}=0x1 +phy_chain_tx_polarity_flip_physical{3.0}=0x0 +phy_chain_tx_polarity_flip_physical{4.0}=0x0 +phy_chain_tx_polarity_flip_physical{5.0}=0x1 +phy_chain_tx_polarity_flip_physical{6.0}=0x1 +phy_chain_tx_polarity_flip_physical{7.0}=0x0 +phy_chain_tx_polarity_flip_physical{8.0}=0x1 +phy_chain_tx_polarity_flip_physical{9.0}=0x1 +phy_chain_tx_polarity_flip_physical{10.0}=0x1 +phy_chain_tx_polarity_flip_physical{11.0}=0x0 +phy_chain_tx_polarity_flip_physical{12.0}=0x0 +phy_chain_tx_polarity_flip_physical{13.0}=0x1 +phy_chain_tx_polarity_flip_physical{14.0}=0x1 +phy_chain_tx_polarity_flip_physical{15.0}=0x0 +phy_chain_tx_polarity_flip_physical{16.0}=0x1 +phy_chain_tx_polarity_flip_physical{17.0}=0x0 +phy_chain_tx_polarity_flip_physical{18.0}=0x0 +phy_chain_tx_polarity_flip_physical{19.0}=0x0 +phy_chain_tx_polarity_flip_physical{20.0}=0x0 +phy_chain_tx_polarity_flip_physical{21.0}=0x1 +phy_chain_tx_polarity_flip_physical{22.0}=0x1 +phy_chain_tx_polarity_flip_physical{23.0}=0x0 +phy_chain_tx_polarity_flip_physical{24.0}=0x0 +phy_chain_tx_polarity_flip_physical{25.0}=0x0 +phy_chain_tx_polarity_flip_physical{26.0}=0x0 +phy_chain_tx_polarity_flip_physical{27.0}=0x1 +phy_chain_tx_polarity_flip_physical{28.0}=0x0 +phy_chain_tx_polarity_flip_physical{29.0}=0x0 +phy_chain_tx_polarity_flip_physical{30.0}=0x0 +phy_chain_tx_polarity_flip_physical{31.0}=0x1 +phy_chain_tx_polarity_flip_physical{32.0}=0x1 +phy_chain_tx_polarity_flip_physical{33.0}=0x1 +phy_chain_tx_polarity_flip_physical{34.0}=0x1 +phy_chain_tx_polarity_flip_physical{35.0}=0x1 +phy_chain_tx_polarity_flip_physical{36.0}=0x1 +phy_chain_tx_polarity_flip_physical{37.0}=0x0 +phy_chain_tx_polarity_flip_physical{38.0}=0x0 +phy_chain_tx_polarity_flip_physical{39.0}=0x1 +phy_chain_tx_polarity_flip_physical{40.0}=0x1 +phy_chain_tx_polarity_flip_physical{41.0}=0x0 +phy_chain_tx_polarity_flip_physical{42.0}=0x1 +phy_chain_tx_polarity_flip_physical{43.0}=0x1 +phy_chain_tx_polarity_flip_physical{44.0}=0x1 +phy_chain_tx_polarity_flip_physical{45.0}=0x0 +phy_chain_tx_polarity_flip_physical{46.0}=0x0 +phy_chain_tx_polarity_flip_physical{47.0}=0x1 +phy_chain_tx_polarity_flip_physical{48.0}=0x1 +phy_chain_tx_polarity_flip_physical{49.0}=0x1 +phy_chain_tx_polarity_flip_physical{50.0}=0x1 +phy_chain_tx_polarity_flip_physical{51.0}=0x1 +phy_chain_tx_polarity_flip_physical{52.0}=0x1 +phy_chain_tx_polarity_flip_physical{53.0}=0x0 +phy_chain_tx_polarity_flip_physical{54.0}=0x0 +phy_chain_tx_polarity_flip_physical{55.0}=0x1 +phy_chain_tx_polarity_flip_physical{56.0}=0x1 +phy_chain_tx_polarity_flip_physical{57.0}=0x0 +phy_chain_tx_polarity_flip_physical{58.0}=0x1 +phy_chain_tx_polarity_flip_physical{59.0}=0x1 +phy_chain_tx_polarity_flip_physical{60.0}=0x1 +phy_chain_tx_polarity_flip_physical{61.0}=0x0 +phy_chain_tx_polarity_flip_physical{62.0}=0x0 +phy_chain_tx_polarity_flip_physical{63.0}=0x1 +phy_chain_tx_polarity_flip_physical{64.0}=0x1 +phy_chain_tx_polarity_flip_physical{65.0}=0x1 +phy_chain_tx_polarity_flip_physical{66.0}=0x1 +phy_chain_tx_polarity_flip_physical{67.0}=0x1 +phy_chain_tx_polarity_flip_physical{68.0}=0x1 +phy_chain_tx_polarity_flip_physical{69.0}=0x0 +phy_chain_tx_polarity_flip_physical{70.0}=0x1 +phy_chain_tx_polarity_flip_physical{71.0}=0x1 +phy_chain_tx_polarity_flip_physical{72.0}=0x1 +phy_chain_tx_polarity_flip_physical{73.0}=0x0 +phy_chain_tx_polarity_flip_physical{74.0}=0x1 +phy_chain_tx_polarity_flip_physical{75.0}=0x1 +phy_chain_tx_polarity_flip_physical{76.0}=0x1 +phy_chain_tx_polarity_flip_physical{77.0}=0x0 +phy_chain_tx_polarity_flip_physical{78.0}=0x0 +phy_chain_tx_polarity_flip_physical{79.0}=0x1 +phy_chain_tx_polarity_flip_physical{80.0}=0x1 +phy_chain_tx_polarity_flip_physical{81.0}=0x1 +phy_chain_tx_polarity_flip_physical{82.0}=0x1 +phy_chain_tx_polarity_flip_physical{83.0}=0x1 +phy_chain_tx_polarity_flip_physical{84.0}=0x1 +phy_chain_tx_polarity_flip_physical{85.0}=0x0 +phy_chain_tx_polarity_flip_physical{86.0}=0x0 +phy_chain_tx_polarity_flip_physical{87.0}=0x1 +phy_chain_tx_polarity_flip_physical{88.0}=0x1 +phy_chain_tx_polarity_flip_physical{89.0}=0x0 +phy_chain_tx_polarity_flip_physical{90.0}=0x1 +phy_chain_tx_polarity_flip_physical{91.0}=0x1 +phy_chain_tx_polarity_flip_physical{92.0}=0x1 +phy_chain_tx_polarity_flip_physical{93.0}=0x0 +phy_chain_tx_polarity_flip_physical{94.0}=0x0 +phy_chain_tx_polarity_flip_physical{95.0}=0x1 +phy_chain_tx_polarity_flip_physical{96.0}=0x1 +phy_chain_tx_polarity_flip_physical{97.0}=0x1 +phy_chain_tx_polarity_flip_physical{98.0}=0x1 +phy_chain_tx_polarity_flip_physical{99.0}=0x1 +phy_chain_tx_polarity_flip_physical{100.0}=0x1 +phy_chain_tx_polarity_flip_physical{101.0}=0x0 +phy_chain_tx_polarity_flip_physical{102.0}=0x1 +phy_chain_tx_polarity_flip_physical{103.0}=0x1 +phy_chain_tx_polarity_flip_physical{104.0}=0x0 +phy_chain_tx_polarity_flip_physical{105.0}=0x1 +phy_chain_tx_polarity_flip_physical{106.0}=0x0 +phy_chain_tx_polarity_flip_physical{107.0}=0x0 +phy_chain_tx_polarity_flip_physical{108.0}=0x0 +phy_chain_tx_polarity_flip_physical{109.0}=0x1 +phy_chain_tx_polarity_flip_physical{110.0}=0x1 +phy_chain_tx_polarity_flip_physical{111.0}=0x0 +phy_chain_tx_polarity_flip_physical{112.0}=0x0 +phy_chain_tx_polarity_flip_physical{113.0}=0x0 +phy_chain_tx_polarity_flip_physical{114.0}=0x0 +phy_chain_tx_polarity_flip_physical{115.0}=0x0 +phy_chain_tx_polarity_flip_physical{116.0}=0x0 +phy_chain_tx_polarity_flip_physical{117.0}=0x1 +phy_chain_tx_polarity_flip_physical{118.0}=0x1 +phy_chain_tx_polarity_flip_physical{119.0}=0x0 +phy_chain_tx_polarity_flip_physical{120.0}=0x0 +phy_chain_tx_polarity_flip_physical{121.0}=0x1 +phy_chain_tx_polarity_flip_physical{122.0}=0x0 +phy_chain_tx_polarity_flip_physical{123.0}=0x0 +phy_chain_tx_polarity_flip_physical{124.0}=0x0 +phy_chain_tx_polarity_flip_physical{125.0}=0x1 +phy_chain_tx_polarity_flip_physical{126.0}=0x1 +phy_chain_tx_polarity_flip_physical{127.0}=0x0 +phy_chain_tx_polarity_flip_physical{128.0}=0x0 +phy_chain_tx_polarity_flip_physical{129.0}=0x0 +phy_chain_tx_polarity_flip_physical{131.0}=0x0 +portmap_1=1:50:2 +portmap_3=3:50:2 +portmap_5=5:50:2 +portmap_7=7:50:2 +portmap_9=9:50:2 +portmap_11=11:50:2 +portmap_13=13:50:2 +portmap_15=15:50:2 +portmap_17=17:50:2 +portmap_19=19:50:2 +portmap_21=21:50:2 +portmap_23=23:50:2 +portmap_25=25:100 +portmap_29=29:100 +portmap_33=33:100 +portmap_37=37:100 +portmap_41=41:50:2 +portmap_43=43:50:2 +portmap_45=45:50:2 +portmap_47=47:50:2 +portmap_49=49:50:2 +portmap_51=51:50:2 +portmap_53=53:50:2 +portmap_55=55:50:2 +portmap_57=57:50:2 +portmap_59=59:50:2 +portmap_61=61:50:2 +portmap_63=63:50:2 +# skip 2 +portmap_67=65:50:2 +portmap_69=67:50:2 +portmap_71=69:50:2 +portmap_73=71:50:2 +portmap_75=73:50:2 +portmap_77=75:50:2 +portmap_79=77:50:2 +portmap_81=79:50:2 +portmap_83=81:50:2 +portmap_85=83:50:2 +portmap_87=85:50:2 +portmap_89=87:50:2 +portmap_91=89:100 +portmap_95=93:100 +portmap_99=97:100 +portmap_103=101:100 +portmap_107=105:50:2 +portmap_109=107:50:2 +portmap_111=109:50:2 +portmap_113=111:50:2 +portmap_115=113:50:2 +portmap_117=115:50:2 +portmap_119=117:50:2 +portmap_121=119:50:2 +portmap_123=121:50:2 +portmap_125=123:50:2 +portmap_127=125:50:2 +portmap_129=127:50:2 +serdes_core_rx_polarity_flip_physical{1}=0x8 +serdes_core_rx_polarity_flip_physical{5}=0x2 +serdes_core_rx_polarity_flip_physical{9}=0xc +serdes_core_rx_polarity_flip_physical{13}=0x3 +serdes_core_rx_polarity_flip_physical{17}=0x4 +serdes_core_rx_polarity_flip_physical{21}=0x3 +serdes_core_rx_polarity_flip_physical{25}=0x6 +serdes_core_rx_polarity_flip_physical{29}=0x3 +serdes_core_rx_polarity_flip_physical{33}=0x4 +serdes_core_rx_polarity_flip_physical{37}=0x3 +serdes_core_rx_polarity_flip_physical{41}=0xc +serdes_core_rx_polarity_flip_physical{45}=0x3 +serdes_core_rx_polarity_flip_physical{49}=0x4 +serdes_core_rx_polarity_flip_physical{53}=0x3 +serdes_core_rx_polarity_flip_physical{57}=0xc +serdes_core_rx_polarity_flip_physical{61}=0x3 +serdes_core_rx_polarity_flip_physical{65}=0xb +serdes_core_rx_polarity_flip_physical{69}=0xc +serdes_core_rx_polarity_flip_physical{73}=0x7 +serdes_core_rx_polarity_flip_physical{77}=0xc +serdes_core_rx_polarity_flip_physical{81}=0xb +serdes_core_rx_polarity_flip_physical{85}=0xc +serdes_core_rx_polarity_flip_physical{89}=0x7 +serdes_core_rx_polarity_flip_physical{93}=0xc +serdes_core_rx_polarity_flip_physical{97}=0xb +serdes_core_rx_polarity_flip_physical{101}=0x9 +serdes_core_rx_polarity_flip_physical{105}=0x7 +serdes_core_rx_polarity_flip_physical{109}=0xc +serdes_core_rx_polarity_flip_physical{113}=0xb +serdes_core_rx_polarity_flip_physical{117}=0xc +serdes_core_rx_polarity_flip_physical{121}=0x7 +serdes_core_rx_polarity_flip_physical{125}=0xc +serdes_core_rx_polarity_flip_physical{129}=0x0 +serdes_core_tx_polarity_flip_physical{1}=0x3 +serdes_core_tx_polarity_flip_physical{5}=0xb +serdes_core_tx_polarity_flip_physical{9}=0x3 +serdes_core_tx_polarity_flip_physical{13}=0xb +serdes_core_tx_polarity_flip_physical{17}=0x0 +serdes_core_tx_polarity_flip_physical{21}=0x3 +serdes_core_tx_polarity_flip_physical{25}=0x4 +serdes_core_tx_polarity_flip_physical{29}=0xc +serdes_core_tx_polarity_flip_physical{33}=0xf +serdes_core_tx_polarity_flip_physical{37}=0xc +serdes_core_tx_polarity_flip_physical{41}=0xe +serdes_core_tx_polarity_flip_physical{45}=0xc +serdes_core_tx_polarity_flip_physical{49}=0xf +serdes_core_tx_polarity_flip_physical{53}=0xc +serdes_core_tx_polarity_flip_physical{57}=0xe +serdes_core_tx_polarity_flip_physical{61}=0xc +serdes_core_tx_polarity_flip_physical{65}=0xf +serdes_core_tx_polarity_flip_physical{69}=0xe +serdes_core_tx_polarity_flip_physical{73}=0xe +serdes_core_tx_polarity_flip_physical{77}=0xc +serdes_core_tx_polarity_flip_physical{81}=0xf +serdes_core_tx_polarity_flip_physical{85}=0xc +serdes_core_tx_polarity_flip_physical{89}=0xe +serdes_core_tx_polarity_flip_physical{93}=0xc +serdes_core_tx_polarity_flip_physical{97}=0xf +serdes_core_tx_polarity_flip_physical{101}=0x6 +serdes_core_tx_polarity_flip_physical{105}=0x1 +serdes_core_tx_polarity_flip_physical{109}=0x3 +serdes_core_tx_polarity_flip_physical{113}=0x0 +serdes_core_tx_polarity_flip_physical{117}=0x3 +serdes_core_tx_polarity_flip_physical{121}=0x1 +serdes_core_tx_polarity_flip_physical{125}=0x3 +serdes_core_tx_polarity_flip_physical{129}=0x0 +serdes_preemphasis_1=0x45808 +serdes_preemphasis_3=0x45808 +serdes_preemphasis_5=0x45808 +serdes_preemphasis_7=0x45808 +serdes_preemphasis_9=0x45808 +serdes_preemphasis_11=0x45808 +serdes_preemphasis_13=0x45808 +serdes_preemphasis_15=0x45808 +serdes_preemphasis_17=0x45808 +serdes_preemphasis_19=0x45808 +serdes_preemphasis_21=0x45808 +serdes_preemphasis_23=0x45808 +serdes_preemphasis_25=0xd3e05 +serdes_preemphasis_29=0xd3e05 +serdes_preemphasis_33=0xb3403 +serdes_preemphasis_37=0x93603 +serdes_preemphasis_41=0x580c +serdes_preemphasis_43=0x580c +serdes_preemphasis_45=0x580c +serdes_preemphasis_47=0x580c +serdes_preemphasis_49=0x580c +serdes_preemphasis_51=0x580c +serdes_preemphasis_53=0x580c +serdes_preemphasis_55=0x580c +serdes_preemphasis_57=0x580c +serdes_preemphasis_59=0x580c +serdes_preemphasis_61=0x580c +serdes_preemphasis_63=0x580c +serdes_preemphasis_67=0x580c +serdes_preemphasis_69=0x580c +serdes_preemphasis_71=0x580c +serdes_preemphasis_73=0x580c +serdes_preemphasis_75=0x580c +serdes_preemphasis_77=0x580c +serdes_preemphasis_79=0x580c +serdes_preemphasis_81=0x580c +serdes_preemphasis_83=0x580c +serdes_preemphasis_85=0x580c +serdes_preemphasis_87=0x580c +serdes_preemphasis_89=0x580c +serdes_preemphasis_91=0x93603 +serdes_preemphasis_95=0xd3e05 +serdes_preemphasis_99=0xb3403 +serdes_preemphasis_103=0xd3e05 +serdes_preemphasis_107=0x85804 +serdes_preemphasis_109=0x85804 +serdes_preemphasis_111=0x85804 +serdes_preemphasis_113=0x85804 +serdes_preemphasis_115=0x85804 +serdes_preemphasis_117=0x85804 +serdes_preemphasis_119=0x85804 +serdes_preemphasis_121=0x85804 +serdes_preemphasis_123=0x85804 +serdes_preemphasis_125=0x85804 +serdes_preemphasis_127=0x85804 +serdes_preemphasis_129=0x85804 diff --git a/device/arista/x86_64-arista_7050cx3_32s/pmon_daemon_control.json b/device/arista/x86_64-arista_7050cx3_32s/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7050cx3_32s/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7050cx3_32s/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7050cx3_32s/thermal_policy.json b/device/arista/x86_64-arista_7050cx3_32s/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7050cx3_32s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/BALANCED b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/BALANCED new file mode 120000 index 00000000000..87afd08ffcd --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/RDMA-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/RDMA-CENTRIC new file mode 120000 index 00000000000..a05581efb9f --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/TCP-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/TCP-CENTRIC new file mode 120000 index 00000000000..dd9cf046c0f --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t0.j2 new file mode 100644 index 00000000000..2f41924b4fc --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t1.j2 new file mode 100644 index 00000000000..2f41924b4fc --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 deleted file mode 100644 index 0869e63968a..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 deleted file mode 100644 index 80e96bdceca..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 new file mode 120000 index 00000000000..c25cc95d6d5 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9b..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 deleted file mode 100644 index 34002048afd..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/sai.profile index 4f8c558b088..66f88f894c3 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/sai.profile +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-a7060-cx32s-32x100G-t1.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm index 039fd955836..95a947003fb 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/th-a7060-cx32s-32x100G-t1.config.bcm @@ -3,7 +3,7 @@ phy_an_allow_pll_change=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/BALANCED b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/BALANCED new file mode 120000 index 00000000000..87afd08ffcd --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/RDMA-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/RDMA-CENTRIC new file mode 120000 index 00000000000..a05581efb9f --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/TCP-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/TCP-CENTRIC new file mode 120000 index 00000000000..dd9cf046c0f --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 new file mode 100644 index 00000000000..a3c33da6399 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffer_ports_t0.j2 @@ -0,0 +1,21 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,6) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(10,22) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(26,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(6,10) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(22,26) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 deleted file mode 100644 index 5add8968e62..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1,61 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,6) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(10,22) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(24,32) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(6,10) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(22,24) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini deleted file mode 100644 index 0b5d680edda..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 79872 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 56160 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 85696 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 deleted file mode 100644 index 34002048afd..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/sai.profile index 87b4ffdadd6..692f79decc1 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/sai.profile +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-a7060-cx32s-8x100G+48x50G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm index 326a51ada84..5c70d324dbb 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-D48C8/th-a7060-cx32s-8x100G+48x50G.config.bcm @@ -3,7 +3,7 @@ phy_an_allow_pll_change=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/sai.profile index 42e0c57347a..08abf119894 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/sai.profile +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-a7060-cx32s-8x100G+24x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm index 7149b5e7ef5..05908a259c4 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q24C8/th-a7060-cx32s-8x100G+24x40G.config.bcm @@ -3,7 +3,7 @@ phy_an_allow_pll_change=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/BALANCED b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/BALANCED new file mode 120000 index 00000000000..87afd08ffcd --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/RDMA-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/RDMA-CENTRIC new file mode 120000 index 00000000000..a05581efb9f --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/TCP-CENTRIC b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/TCP-CENTRIC new file mode 120000 index 00000000000..dd9cf046c0f --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t0.j2 new file mode 100644 index 00000000000..2f41924b4fc --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t1.j2 new file mode 100644 index 00000000000..2f41924b4fc --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,128,4) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 deleted file mode 100644 index 0869e63968a..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 deleted file mode 100644 index 80e96bdceca..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,128,4) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 new file mode 120000 index 00000000000..c25cc95d6d5 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9b..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 deleted file mode 100644 index 34002048afd..00000000000 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/sai.profile.j2 b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/sai.profile.j2 index 638fd28b076..5a50185247a 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/sai.profile.j2 +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/sai.profile.j2 @@ -1,7 +1,7 @@ {# Get sai.profile based on switch_role #} {%- if DEVICE_METADATA is defined -%} {%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} -{%- if switch_role.lower() == 'torrouter' %} +{%- if 'torrouter' in switch_role.lower() %} {% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-a7060-cx32s-32x40G-t0.config.bcm' -%} {%- else %} {%- set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-a7060-cx32s-32x40G-t1.config.bcm' -%} @@ -11,3 +11,4 @@ {%- endif %} {# Write the contents of sai_ profile_filename to sai.profile file #} {{ sai_profile_contents }} +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm index 0cb4ae4a474..c011ad93f4d 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t0.config.bcm @@ -3,7 +3,7 @@ phy_an_allow_pll_change=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm index c3218645ac2..65a7d57b551 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-Q32/th-a7060-cx32s-32x40G-t1.config.bcm @@ -3,7 +3,7 @@ phy_an_allow_pll_change=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/sai.profile index d54a263e72b..f9a1e2bdc4d 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/sai.profile +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-a7060-cx32s-8x100G+96x25G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm index d3b9a758ba1..467d428830c 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-T96C8/th-a7060-cx32s-8x100G+96x25G.config.bcm @@ -3,7 +3,7 @@ phy_an_allow_pll_change=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7060_cx32s/platform-init b/device/arista/x86_64-arista_7060_cx32s/platform-init new file mode 100755 index 00000000000..e31a7a0db4c --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/platform-init @@ -0,0 +1,3 @@ +# Increase PCIe timeout value to 210ms +setpci -s01:00.0 CAP_EXP+0x28.B=6 +setpci -s01:00.1 CAP_EXP+0x28.B=6 diff --git a/device/arista/x86_64-arista_7060_cx32s/pmon_daemon_control.json b/device/arista/x86_64-arista_7060_cx32s/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7060_cx32s/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7060_cx32s/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060_cx32s/thermal_policy.json b/device/arista/x86_64-arista_7060_cx32s/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060cx2_32s/pmon_daemon_control.json b/device/arista/x86_64-arista_7060cx2_32s/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7060cx2_32s/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7060cx2_32s/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060cx2_32s/thermal_policy.json b/device/arista/x86_64-arista_7060cx2_32s/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7060cx2_32s/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/sai.profile b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/sai.profile index 8f820cb0f06..9d051624c58 100644 --- a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/sai.profile +++ b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th3-a7060px4-32-64x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/sai.profile b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/sai.profile index 2163c4be905..c9a6b4d330c 100644 --- a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/sai.profile +++ b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th3-a7060px4-o32-32x400G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7060px4_32/pmon_daemon_control.json b/device/arista/x86_64-arista_7060px4_32/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7060px4_32/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7060px4_32/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7060px4_32/thermal_policy.json b/device/arista/x86_64-arista_7060px4_32/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7060px4_32/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7170_32c/pmon_daemon_control.json b/device/arista/x86_64-arista_7170_32c/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7170_32c/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7170_32c/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7170_32c/thermal_policy.json b/device/arista/x86_64-arista_7170_32c/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7170_32c/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7170_32cd/pmon_daemon_control.json b/device/arista/x86_64-arista_7170_32cd/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7170_32cd/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7170_32cd/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7170_32cd/thermal_policy.json b/device/arista/x86_64-arista_7170_32cd/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7170_32cd/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7170_64c/pmon_daemon_control.json b/device/arista/x86_64-arista_7170_64c/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7170_64c/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7170_64c/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7170_64c/thermal_policy.json b/device/arista/x86_64-arista_7170_64c/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7170_64c/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/BALANCED b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/BALANCED new file mode 120000 index 00000000000..a270c70ffc3 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/RDMA-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/RDMA-CENTRIC new file mode 120000 index 00000000000..8d1ec6d277a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/TCP-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/TCP-CENTRIC new file mode 120000 index 00000000000..7ee783aac6a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t0.j2 new file mode 100644 index 00000000000..2d56c4b38f9 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t1.j2 new file mode 100644 index 00000000000..2d56c4b38f9 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers.json.j2 new file mode 100644 index 00000000000..b67cf577ab7 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't1' %} +{%- include 'buffers_config.j2' %} + diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 new file mode 120000 index 00000000000..c25cc95d6d5 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile deleted file mode 100644 index 74aea949c3b..00000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile +++ /dev/null @@ -1 +0,0 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-64x100G.config.bcm diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile.j2 new file mode 100644 index 00000000000..403c797a47f --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile.j2 @@ -0,0 +1,14 @@ +{# Get sai.profile based on switch_role #} +{%- if DEVICE_METADATA is defined -%} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} +{%- if 'torrouter' in switch_role.lower() or 'torswitch' in switch_role.lower() %} +{% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-64x100G-t0.config.bcm' -%} +{%- else %} +{% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-64x100G-t1.config.bcm' -%} +{%- endif %} +{%- else %} +{% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-64x100G-t1.config.bcm' -%} +{%- endif %} +{# Write the contents of sai_ profile_filename to sai.profile file #} +{{ sai_profile_contents }} +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G-t0.config.bcm similarity index 99% rename from device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm rename to device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G-t0.config.bcm index 44fb6f7536b..faeeb4bb1ea 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G.config.bcm +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G-t0.config.bcm @@ -1,7 +1,7 @@ PHY_AN_ALLOW_PLL_CHANGE=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 @@ -1011,3 +1011,5 @@ serdes_preemphasis_114=0x174507 serdes_preemphasis_115=0x184606 serdes_preemphasis_116=0x103706 serdes_preemphasis_117=0x133c06 + +mmu_init_config="MSFT-TH2-Tier0" diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G-t1.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G-t1.config.bcm new file mode 100644 index 00000000000..96fa6f32d63 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/th2-a7260cx3-64-64x100G-t1.config.bcm @@ -0,0 +1,1015 @@ +PHY_AN_ALLOW_PLL_CHANGE=1 +arl_clean_timeout_usec=15000000 +asf_mem_profile=2 +bcm_num_cos=10 +bcm_stat_flags=1 +bcm_stat_jumbo=9236 +cdma_timeout_usec=15000000 +core_clock_frequency=1700 +dma_desc_timeout_usec=15000000 +dpp_clock_ratio=2:3 +higig2_hdr_mode=1 +ipv6_lpm_128b_enable=1 +l3_alpm_enable=2 +lpm_scaling_enable=0 +l2xmsg_mode=1 +max_vp_lags=0 +mem_scan_enable=1 +miim_intr_enable=0 +module_64ports=1 +os=unix +oversubscribe_mode=1 +pbmp_xport_xe=0x40003ffff0000ffffc0003fffe0001fffe +phy_an_allow_pll_change_hg=0 +phy_an_c73_100=1 +phy_an_c73_102=1 +phy_an_c73_103=1 +phy_an_c73_104=1 +phy_an_c73_105=1 +phy_an_c73_106=1 +phy_an_c73_107=1 +phy_an_c73_108=1 +phy_an_c73_109=1 +phy_an_c73_10=1 +phy_an_c73_110=1 +phy_an_c73_111=1 +phy_an_c73_112=1 +phy_an_c73_113=1 +phy_an_c73_114=1 +phy_an_c73_115=1 +phy_an_c73_116=1 +phy_an_c73_117=1 +phy_an_c73_11=1 +phy_an_c73_12=1 +phy_an_c73_13=1 +phy_an_c73_14=1 +phy_an_c73_15=1 +phy_an_c73_16=1 +phy_an_c73_1=1 +phy_an_c73_2=1 +phy_an_c73_34=1 +phy_an_c73_35=1 +phy_an_c73_36=1 +phy_an_c73_37=1 +phy_an_c73_38=1 +phy_an_c73_39=1 +phy_an_c73_3=1 +phy_an_c73_40=1 +phy_an_c73_41=1 +phy_an_c73_42=1 +phy_an_c73_43=1 +phy_an_c73_44=1 +phy_an_c73_45=1 +phy_an_c73_46=1 +phy_an_c73_47=1 +phy_an_c73_48=1 +phy_an_c73_49=1 +phy_an_c73_4=1 +phy_an_c73_5=1 +phy_an_c73_66=1 +phy_an_c73_68=1 +phy_an_c73_69=1 +phy_an_c73_6=1 +phy_an_c73_70=1 +phy_an_c73_71=1 +phy_an_c73_72=1 +phy_an_c73_73=1 +phy_an_c73_74=1 +phy_an_c73_75=1 +phy_an_c73_76=1 +phy_an_c73_77=1 +phy_an_c73_78=1 +phy_an_c73_79=1 +phy_an_c73_7=1 +phy_an_c73_80=1 +phy_an_c73_81=1 +phy_an_c73_82=1 +phy_an_c73_83=1 +phy_an_c73_8=1 +phy_an_c73_9=1 +phy_chain_rx_lane_map_physical{1.0}=0x3210 +phy_chain_rx_lane_map_physical{101.0}=0x0123 +phy_chain_rx_lane_map_physical{105.0}=0x0123 +phy_chain_rx_lane_map_physical{109.0}=0x0123 +phy_chain_rx_lane_map_physical{113.0}=0x2301 +phy_chain_rx_lane_map_physical{117.0}=0x3210 +phy_chain_rx_lane_map_physical{121.0}=0x3210 +phy_chain_rx_lane_map_physical{125.0}=0x1203 +phy_chain_rx_lane_map_physical{129.0}=0x3210 +phy_chain_rx_lane_map_physical{13.0}=0x0321 +phy_chain_rx_lane_map_physical{133.0}=0x1032 +phy_chain_rx_lane_map_physical{137.0}=0x3210 +phy_chain_rx_lane_map_physical{141.0}=0x0123 +phy_chain_rx_lane_map_physical{145.0}=0x3210 +phy_chain_rx_lane_map_physical{149.0}=0x2310 +phy_chain_rx_lane_map_physical{153.0}=0x0132 +phy_chain_rx_lane_map_physical{157.0}=0x1302 +phy_chain_rx_lane_map_physical{161.0}=0x3021 +phy_chain_rx_lane_map_physical{165.0}=0x2031 +phy_chain_rx_lane_map_physical{169.0}=0x2031 +phy_chain_rx_lane_map_physical{17.0}=0x3210 +phy_chain_rx_lane_map_physical{173.0}=0x1302 +phy_chain_rx_lane_map_physical{177.0}=0x2031 +phy_chain_rx_lane_map_physical{181.0}=0x0213 +phy_chain_rx_lane_map_physical{185.0}=0x0213 +phy_chain_rx_lane_map_physical{189.0}=0x1302 +phy_chain_rx_lane_map_physical{193.0}=0x3120 +phy_chain_rx_lane_map_physical{197.0}=0x0231 +phy_chain_rx_lane_map_physical{201.0}=0x2031 +phy_chain_rx_lane_map_physical{205.0}=0x0213 +phy_chain_rx_lane_map_physical{209.0}=0x2013 +phy_chain_rx_lane_map_physical{21.0}=0x3021 +phy_chain_rx_lane_map_physical{213.0}=0x3021 +phy_chain_rx_lane_map_physical{217.0}=0x0231 +phy_chain_rx_lane_map_physical{221.0}=0x2031 +phy_chain_rx_lane_map_physical{225.0}=0x1203 +phy_chain_rx_lane_map_physical{229.0}=0x1230 +phy_chain_rx_lane_map_physical{233.0}=0x3021 +phy_chain_rx_lane_map_physical{237.0}=0x1032 +phy_chain_rx_lane_map_physical{241.0}=0x2301 +phy_chain_rx_lane_map_physical{245.0}=0x0321 +phy_chain_rx_lane_map_physical{249.0}=0x2301 +phy_chain_rx_lane_map_physical{25.0}=0x2301 +phy_chain_rx_lane_map_physical{253.0}=0x2301 +phy_chain_rx_lane_map_physical{257.0}=0x3210 +phy_chain_rx_lane_map_physical{29.0}=0x3021 +phy_chain_rx_lane_map_physical{33.0}=0x1302 +phy_chain_rx_lane_map_physical{37.0}=0x2031 +phy_chain_rx_lane_map_physical{41.0}=0x3021 +phy_chain_rx_lane_map_physical{45.0}=0x1023 +phy_chain_rx_lane_map_physical{49.0}=0x0213 +phy_chain_rx_lane_map_physical{5.0}=0x3201 +phy_chain_rx_lane_map_physical{53.0}=0x3201 +phy_chain_rx_lane_map_physical{57.0}=0x2013 +phy_chain_rx_lane_map_physical{61.0}=0x0213 +phy_chain_rx_lane_map_physical{65.0}=0x1203 +phy_chain_rx_lane_map_physical{69.0}=0x0213 +phy_chain_rx_lane_map_physical{73.0}=0x0213 +phy_chain_rx_lane_map_physical{77.0}=0x3120 +phy_chain_rx_lane_map_physical{81.0}=0x0213 +phy_chain_rx_lane_map_physical{85.0}=0x2031 +phy_chain_rx_lane_map_physical{89.0}=0x2031 +phy_chain_rx_lane_map_physical{9.0}=0x0321 +phy_chain_rx_lane_map_physical{93.0}=0x3120 +phy_chain_rx_lane_map_physical{97.0}=0x1203 +phy_chain_rx_polarity_flip_physical{1.0}=0x1 +phy_chain_rx_polarity_flip_physical{10.0}=0x0 +phy_chain_rx_polarity_flip_physical{100.0}=0x1 +phy_chain_rx_polarity_flip_physical{101.0}=0x1 +phy_chain_rx_polarity_flip_physical{102.0}=0x0 +phy_chain_rx_polarity_flip_physical{103.0}=0x1 +phy_chain_rx_polarity_flip_physical{104.0}=0x0 +phy_chain_rx_polarity_flip_physical{105.0}=0x1 +phy_chain_rx_polarity_flip_physical{106.0}=0x0 +phy_chain_rx_polarity_flip_physical{107.0}=0x1 +phy_chain_rx_polarity_flip_physical{108.0}=0x0 +phy_chain_rx_polarity_flip_physical{109.0}=0x0 +phy_chain_rx_polarity_flip_physical{11.0}=0x1 +phy_chain_rx_polarity_flip_physical{110.0}=0x1 +phy_chain_rx_polarity_flip_physical{111.0}=0x0 +phy_chain_rx_polarity_flip_physical{112.0}=0x1 +phy_chain_rx_polarity_flip_physical{113.0}=0x1 +phy_chain_rx_polarity_flip_physical{114.0}=0x0 +phy_chain_rx_polarity_flip_physical{115.0}=0x1 +phy_chain_rx_polarity_flip_physical{116.0}=0x0 +phy_chain_rx_polarity_flip_physical{117.0}=0x0 +phy_chain_rx_polarity_flip_physical{118.0}=0x0 +phy_chain_rx_polarity_flip_physical{119.0}=0x1 +phy_chain_rx_polarity_flip_physical{12.0}=0x1 +phy_chain_rx_polarity_flip_physical{120.0}=0x0 +phy_chain_rx_polarity_flip_physical{121.0}=0x1 +phy_chain_rx_polarity_flip_physical{122.0}=0x0 +phy_chain_rx_polarity_flip_physical{123.0}=0x1 +phy_chain_rx_polarity_flip_physical{124.0}=0x0 +phy_chain_rx_polarity_flip_physical{125.0}=0x0 +phy_chain_rx_polarity_flip_physical{126.0}=0x1 +phy_chain_rx_polarity_flip_physical{127.0}=0x1 +phy_chain_rx_polarity_flip_physical{128.0}=0x1 +phy_chain_rx_polarity_flip_physical{129.0}=0x0 +phy_chain_rx_polarity_flip_physical{13.0}=0x1 +phy_chain_rx_polarity_flip_physical{130.0}=0x1 +phy_chain_rx_polarity_flip_physical{131.0}=0x1 +phy_chain_rx_polarity_flip_physical{132.0}=0x0 +phy_chain_rx_polarity_flip_physical{133.0}=0x1 +phy_chain_rx_polarity_flip_physical{134.0}=0x1 +phy_chain_rx_polarity_flip_physical{135.0}=0x1 +phy_chain_rx_polarity_flip_physical{136.0}=0x0 +phy_chain_rx_polarity_flip_physical{137.0}=0x0 +phy_chain_rx_polarity_flip_physical{138.0}=0x0 +phy_chain_rx_polarity_flip_physical{139.0}=0x1 +phy_chain_rx_polarity_flip_physical{14.0}=0x0 +phy_chain_rx_polarity_flip_physical{140.0}=0x0 +phy_chain_rx_polarity_flip_physical{141.0}=0x1 +phy_chain_rx_polarity_flip_physical{142.0}=0x0 +phy_chain_rx_polarity_flip_physical{143.0}=0x1 +phy_chain_rx_polarity_flip_physical{144.0}=0x0 +phy_chain_rx_polarity_flip_physical{145.0}=0x1 +phy_chain_rx_polarity_flip_physical{146.0}=0x0 +phy_chain_rx_polarity_flip_physical{147.0}=0x1 +phy_chain_rx_polarity_flip_physical{148.0}=0x0 +phy_chain_rx_polarity_flip_physical{149.0}=0x0 +phy_chain_rx_polarity_flip_physical{15.0}=0x1 +phy_chain_rx_polarity_flip_physical{150.0}=0x1 +phy_chain_rx_polarity_flip_physical{151.0}=0x1 +phy_chain_rx_polarity_flip_physical{152.0}=0x0 +phy_chain_rx_polarity_flip_physical{153.0}=0x0 +phy_chain_rx_polarity_flip_physical{154.0}=0x1 +phy_chain_rx_polarity_flip_physical{155.0}=0x1 +phy_chain_rx_polarity_flip_physical{156.0}=0x0 +phy_chain_rx_polarity_flip_physical{157.0}=0x0 +phy_chain_rx_polarity_flip_physical{158.0}=0x0 +phy_chain_rx_polarity_flip_physical{159.0}=0x1 +phy_chain_rx_polarity_flip_physical{16.0}=0x0 +phy_chain_rx_polarity_flip_physical{160.0}=0x0 +phy_chain_rx_polarity_flip_physical{161.0}=0x1 +phy_chain_rx_polarity_flip_physical{162.0}=0x1 +phy_chain_rx_polarity_flip_physical{163.0}=0x0 +phy_chain_rx_polarity_flip_physical{164.0}=0x1 +phy_chain_rx_polarity_flip_physical{165.0}=0x0 +phy_chain_rx_polarity_flip_physical{166.0}=0x0 +phy_chain_rx_polarity_flip_physical{167.0}=0x1 +phy_chain_rx_polarity_flip_physical{168.0}=0x1 +phy_chain_rx_polarity_flip_physical{169.0}=0x1 +phy_chain_rx_polarity_flip_physical{17.0}=0x1 +phy_chain_rx_polarity_flip_physical{170.0}=0x1 +phy_chain_rx_polarity_flip_physical{171.0}=0x0 +phy_chain_rx_polarity_flip_physical{172.0}=0x0 +phy_chain_rx_polarity_flip_physical{173.0}=0x0 +phy_chain_rx_polarity_flip_physical{174.0}=0x0 +phy_chain_rx_polarity_flip_physical{175.0}=0x1 +phy_chain_rx_polarity_flip_physical{176.0}=0x1 +phy_chain_rx_polarity_flip_physical{177.0}=0x1 +phy_chain_rx_polarity_flip_physical{178.0}=0x1 +phy_chain_rx_polarity_flip_physical{179.0}=0x0 +phy_chain_rx_polarity_flip_physical{18.0}=0x0 +phy_chain_rx_polarity_flip_physical{180.0}=0x0 +phy_chain_rx_polarity_flip_physical{181.0}=0x1 +phy_chain_rx_polarity_flip_physical{182.0}=0x1 +phy_chain_rx_polarity_flip_physical{183.0}=0x0 +phy_chain_rx_polarity_flip_physical{184.0}=0x0 +phy_chain_rx_polarity_flip_physical{185.0}=0x0 +phy_chain_rx_polarity_flip_physical{186.0}=0x0 +phy_chain_rx_polarity_flip_physical{187.0}=0x1 +phy_chain_rx_polarity_flip_physical{188.0}=0x1 +phy_chain_rx_polarity_flip_physical{189.0}=0x0 +phy_chain_rx_polarity_flip_physical{19.0}=0x1 +phy_chain_rx_polarity_flip_physical{190.0}=0x0 +phy_chain_rx_polarity_flip_physical{191.0}=0x1 +phy_chain_rx_polarity_flip_physical{192.0}=0x0 +phy_chain_rx_polarity_flip_physical{193.0}=0x0 +phy_chain_rx_polarity_flip_physical{194.0}=0x0 +phy_chain_rx_polarity_flip_physical{195.0}=0x1 +phy_chain_rx_polarity_flip_physical{196.0}=0x1 +phy_chain_rx_polarity_flip_physical{197.0}=0x1 +phy_chain_rx_polarity_flip_physical{198.0}=0x1 +phy_chain_rx_polarity_flip_physical{199.0}=0x0 +phy_chain_rx_polarity_flip_physical{2.0}=0x0 +phy_chain_rx_polarity_flip_physical{20.0}=0x0 +phy_chain_rx_polarity_flip_physical{200.0}=0x0 +phy_chain_rx_polarity_flip_physical{201.0}=0x0 +phy_chain_rx_polarity_flip_physical{202.0}=0x0 +phy_chain_rx_polarity_flip_physical{203.0}=0x1 +phy_chain_rx_polarity_flip_physical{204.0}=0x0 +phy_chain_rx_polarity_flip_physical{205.0}=0x1 +phy_chain_rx_polarity_flip_physical{206.0}=0x1 +phy_chain_rx_polarity_flip_physical{207.0}=0x0 +phy_chain_rx_polarity_flip_physical{208.0}=0x0 +phy_chain_rx_polarity_flip_physical{209.0}=0x1 +phy_chain_rx_polarity_flip_physical{21.0}=0x0 +phy_chain_rx_polarity_flip_physical{210.0}=0x1 +phy_chain_rx_polarity_flip_physical{211.0}=0x0 +phy_chain_rx_polarity_flip_physical{212.0}=0x0 +phy_chain_rx_polarity_flip_physical{213.0}=0x0 +phy_chain_rx_polarity_flip_physical{214.0}=0x0 +phy_chain_rx_polarity_flip_physical{215.0}=0x1 +phy_chain_rx_polarity_flip_physical{216.0}=0x0 +phy_chain_rx_polarity_flip_physical{217.0}=0x0 +phy_chain_rx_polarity_flip_physical{218.0}=0x0 +phy_chain_rx_polarity_flip_physical{219.0}=0x1 +phy_chain_rx_polarity_flip_physical{22.0}=0x0 +phy_chain_rx_polarity_flip_physical{220.0}=0x1 +phy_chain_rx_polarity_flip_physical{221.0}=0x0 +phy_chain_rx_polarity_flip_physical{222.0}=0x0 +phy_chain_rx_polarity_flip_physical{223.0}=0x1 +phy_chain_rx_polarity_flip_physical{224.0}=0x1 +phy_chain_rx_polarity_flip_physical{225.0}=0x1 +phy_chain_rx_polarity_flip_physical{226.0}=0x0 +phy_chain_rx_polarity_flip_physical{227.0}=0x0 +phy_chain_rx_polarity_flip_physical{228.0}=0x1 +phy_chain_rx_polarity_flip_physical{229.0}=0x0 +phy_chain_rx_polarity_flip_physical{23.0}=0x1 +phy_chain_rx_polarity_flip_physical{230.0}=0x0 +phy_chain_rx_polarity_flip_physical{231.0}=0x1 +phy_chain_rx_polarity_flip_physical{232.0}=0x1 +phy_chain_rx_polarity_flip_physical{233.0}=0x1 +phy_chain_rx_polarity_flip_physical{234.0}=0x0 +phy_chain_rx_polarity_flip_physical{235.0}=0x0 +phy_chain_rx_polarity_flip_physical{236.0}=0x0 +phy_chain_rx_polarity_flip_physical{237.0}=0x1 +phy_chain_rx_polarity_flip_physical{238.0}=0x0 +phy_chain_rx_polarity_flip_physical{239.0}=0x1 +phy_chain_rx_polarity_flip_physical{24.0}=0x0 +phy_chain_rx_polarity_flip_physical{240.0}=0x0 +phy_chain_rx_polarity_flip_physical{241.0}=0x1 +phy_chain_rx_polarity_flip_physical{242.0}=0x0 +phy_chain_rx_polarity_flip_physical{243.0}=0x1 +phy_chain_rx_polarity_flip_physical{244.0}=0x0 +phy_chain_rx_polarity_flip_physical{245.0}=0x1 +phy_chain_rx_polarity_flip_physical{246.0}=0x1 +phy_chain_rx_polarity_flip_physical{247.0}=0x1 +phy_chain_rx_polarity_flip_physical{248.0}=0x0 +phy_chain_rx_polarity_flip_physical{249.0}=0x0 +phy_chain_rx_polarity_flip_physical{25.0}=0x1 +phy_chain_rx_polarity_flip_physical{250.0}=0x1 +phy_chain_rx_polarity_flip_physical{251.0}=0x0 +phy_chain_rx_polarity_flip_physical{252.0}=0x1 +phy_chain_rx_polarity_flip_physical{253.0}=0x1 +phy_chain_rx_polarity_flip_physical{254.0}=0x0 +phy_chain_rx_polarity_flip_physical{255.0}=0x1 +phy_chain_rx_polarity_flip_physical{256.0}=0x0 +phy_chain_rx_polarity_flip_physical{257.0}=0x0 +phy_chain_rx_polarity_flip_physical{259.0}=0x0 +phy_chain_rx_polarity_flip_physical{26.0}=0x0 +phy_chain_rx_polarity_flip_physical{27.0}=0x1 +phy_chain_rx_polarity_flip_physical{28.0}=0x0 +phy_chain_rx_polarity_flip_physical{29.0}=0x0 +phy_chain_rx_polarity_flip_physical{3.0}=0x1 +phy_chain_rx_polarity_flip_physical{30.0}=0x0 +phy_chain_rx_polarity_flip_physical{31.0}=0x0 +phy_chain_rx_polarity_flip_physical{32.0}=0x1 +phy_chain_rx_polarity_flip_physical{33.0}=0x0 +phy_chain_rx_polarity_flip_physical{34.0}=0x0 +phy_chain_rx_polarity_flip_physical{35.0}=0x1 +phy_chain_rx_polarity_flip_physical{36.0}=0x1 +phy_chain_rx_polarity_flip_physical{37.0}=0x1 +phy_chain_rx_polarity_flip_physical{38.0}=0x1 +phy_chain_rx_polarity_flip_physical{39.0}=0x0 +phy_chain_rx_polarity_flip_physical{4.0}=0x0 +phy_chain_rx_polarity_flip_physical{40.0}=0x0 +phy_chain_rx_polarity_flip_physical{41.0}=0x0 +phy_chain_rx_polarity_flip_physical{42.0}=0x1 +phy_chain_rx_polarity_flip_physical{43.0}=0x1 +phy_chain_rx_polarity_flip_physical{44.0}=0x1 +phy_chain_rx_polarity_flip_physical{45.0}=0x1 +phy_chain_rx_polarity_flip_physical{46.0}=0x0 +phy_chain_rx_polarity_flip_physical{47.0}=0x0 +phy_chain_rx_polarity_flip_physical{48.0}=0x1 +phy_chain_rx_polarity_flip_physical{49.0}=0x1 +phy_chain_rx_polarity_flip_physical{5.0}=0x1 +phy_chain_rx_polarity_flip_physical{50.0}=0x1 +phy_chain_rx_polarity_flip_physical{51.0}=0x0 +phy_chain_rx_polarity_flip_physical{52.0}=0x0 +phy_chain_rx_polarity_flip_physical{53.0}=0x0 +phy_chain_rx_polarity_flip_physical{54.0}=0x0 +phy_chain_rx_polarity_flip_physical{55.0}=0x1 +phy_chain_rx_polarity_flip_physical{56.0}=0x0 +phy_chain_rx_polarity_flip_physical{57.0}=0x0 +phy_chain_rx_polarity_flip_physical{58.0}=0x0 +phy_chain_rx_polarity_flip_physical{59.0}=0x1 +phy_chain_rx_polarity_flip_physical{6.0}=0x0 +phy_chain_rx_polarity_flip_physical{60.0}=0x1 +phy_chain_rx_polarity_flip_physical{61.0}=0x0 +phy_chain_rx_polarity_flip_physical{62.0}=0x0 +phy_chain_rx_polarity_flip_physical{63.0}=0x1 +phy_chain_rx_polarity_flip_physical{64.0}=0x1 +phy_chain_rx_polarity_flip_physical{65.0}=0x1 +phy_chain_rx_polarity_flip_physical{66.0}=0x1 +phy_chain_rx_polarity_flip_physical{67.0}=0x0 +phy_chain_rx_polarity_flip_physical{68.0}=0x1 +phy_chain_rx_polarity_flip_physical{69.0}=0x0 +phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_rx_polarity_flip_physical{70.0}=0x0 +phy_chain_rx_polarity_flip_physical{71.0}=0x1 +phy_chain_rx_polarity_flip_physical{72.0}=0x1 +phy_chain_rx_polarity_flip_physical{73.0}=0x1 +phy_chain_rx_polarity_flip_physical{74.0}=0x1 +phy_chain_rx_polarity_flip_physical{75.0}=0x0 +phy_chain_rx_polarity_flip_physical{76.0}=0x0 +phy_chain_rx_polarity_flip_physical{77.0}=0x0 +phy_chain_rx_polarity_flip_physical{78.0}=0x0 +phy_chain_rx_polarity_flip_physical{79.0}=0x1 +phy_chain_rx_polarity_flip_physical{8.0}=0x1 +phy_chain_rx_polarity_flip_physical{80.0}=0x1 +phy_chain_rx_polarity_flip_physical{81.0}=0x1 +phy_chain_rx_polarity_flip_physical{82.0}=0x1 +phy_chain_rx_polarity_flip_physical{83.0}=0x0 +phy_chain_rx_polarity_flip_physical{84.0}=0x0 +phy_chain_rx_polarity_flip_physical{85.0}=0x1 +phy_chain_rx_polarity_flip_physical{86.0}=0x1 +phy_chain_rx_polarity_flip_physical{87.0}=0x0 +phy_chain_rx_polarity_flip_physical{88.0}=0x0 +phy_chain_rx_polarity_flip_physical{89.0}=0x0 +phy_chain_rx_polarity_flip_physical{9.0}=0x1 +phy_chain_rx_polarity_flip_physical{90.0}=0x0 +phy_chain_rx_polarity_flip_physical{91.0}=0x1 +phy_chain_rx_polarity_flip_physical{92.0}=0x1 +phy_chain_rx_polarity_flip_physical{93.0}=0x0 +phy_chain_rx_polarity_flip_physical{94.0}=0x0 +phy_chain_rx_polarity_flip_physical{95.0}=0x1 +phy_chain_rx_polarity_flip_physical{96.0}=0x0 +phy_chain_rx_polarity_flip_physical{97.0}=0x1 +phy_chain_rx_polarity_flip_physical{98.0}=0x1 +phy_chain_rx_polarity_flip_physical{99.0}=0x0 +phy_chain_tx_lane_map_physical{1.0}=0x2031 +phy_chain_tx_lane_map_physical{101.0}=0x1023 +phy_chain_tx_lane_map_physical{105.0}=0x1302 +phy_chain_tx_lane_map_physical{109.0}=0x0321 +phy_chain_tx_lane_map_physical{113.0}=0x2301 +phy_chain_tx_lane_map_physical{117.0}=0x3120 +phy_chain_tx_lane_map_physical{121.0}=0x3102 +phy_chain_tx_lane_map_physical{125.0}=0x3210 +phy_chain_tx_lane_map_physical{129.0}=0x1023 +phy_chain_tx_lane_map_physical{13.0}=0x3021 +phy_chain_tx_lane_map_physical{133.0}=0x3210 +phy_chain_tx_lane_map_physical{137.0}=0x2031 +phy_chain_tx_lane_map_physical{141.0}=0x1302 +phy_chain_tx_lane_map_physical{145.0}=0x3210 +phy_chain_tx_lane_map_physical{149.0}=0x0213 +phy_chain_tx_lane_map_physical{153.0}=0x3210 +phy_chain_tx_lane_map_physical{157.0}=0x1320 +phy_chain_tx_lane_map_physical{161.0}=0x3210 +phy_chain_tx_lane_map_physical{165.0}=0x0231 +phy_chain_tx_lane_map_physical{169.0}=0x3120 +phy_chain_tx_lane_map_physical{17.0}=0x1032 +phy_chain_tx_lane_map_physical{173.0}=0x0312 +phy_chain_tx_lane_map_physical{177.0}=0x0231 +phy_chain_tx_lane_map_physical{181.0}=0x3210 +phy_chain_tx_lane_map_physical{185.0}=0x3210 +phy_chain_tx_lane_map_physical{189.0}=0x1320 +phy_chain_tx_lane_map_physical{193.0}=0x0321 +phy_chain_tx_lane_map_physical{197.0}=0x3120 +phy_chain_tx_lane_map_physical{201.0}=0x3120 +phy_chain_tx_lane_map_physical{205.0}=0x0123 +phy_chain_tx_lane_map_physical{209.0}=0x3120 +phy_chain_tx_lane_map_physical{21.0}=0x0213 +phy_chain_tx_lane_map_physical{213.0}=0x3021 +phy_chain_tx_lane_map_physical{217.0}=0x0312 +phy_chain_tx_lane_map_physical{221.0}=0x2301 +phy_chain_tx_lane_map_physical{225.0}=0x0123 +phy_chain_tx_lane_map_physical{229.0}=0x2031 +phy_chain_tx_lane_map_physical{233.0}=0x0231 +phy_chain_tx_lane_map_physical{237.0}=0x0213 +phy_chain_tx_lane_map_physical{241.0}=0x1320 +phy_chain_tx_lane_map_physical{245.0}=0x2031 +phy_chain_tx_lane_map_physical{249.0}=0x3120 +phy_chain_tx_lane_map_physical{25.0}=0x0231 +phy_chain_tx_lane_map_physical{253.0}=0x0321 +phy_chain_tx_lane_map_physical{257.0}=0x3210 +phy_chain_tx_lane_map_physical{29.0}=0x1230 +phy_chain_tx_lane_map_physical{33.0}=0x1032 +phy_chain_tx_lane_map_physical{37.0}=0x0123 +phy_chain_tx_lane_map_physical{41.0}=0x0213 +phy_chain_tx_lane_map_physical{45.0}=0x0132 +phy_chain_tx_lane_map_physical{49.0}=0x2031 +phy_chain_tx_lane_map_physical{5.0}=0x2301 +phy_chain_tx_lane_map_physical{53.0}=0x2301 +phy_chain_tx_lane_map_physical{57.0}=0x2031 +phy_chain_tx_lane_map_physical{61.0}=0x2031 +phy_chain_tx_lane_map_physical{65.0}=0x1230 +phy_chain_tx_lane_map_physical{69.0}=0x2013 +phy_chain_tx_lane_map_physical{73.0}=0x0213 +phy_chain_tx_lane_map_physical{77.0}=0x2310 +phy_chain_tx_lane_map_physical{81.0}=0x0321 +phy_chain_tx_lane_map_physical{85.0}=0x2013 +phy_chain_tx_lane_map_physical{89.0}=0x0213 +phy_chain_tx_lane_map_physical{9.0}=0x3012 +phy_chain_tx_lane_map_physical{93.0}=0x3102 +phy_chain_tx_lane_map_physical{97.0}=0x3210 +phy_chain_tx_polarity_flip_physical{1.0}=0x0 +phy_chain_tx_polarity_flip_physical{10.0}=0x1 +phy_chain_tx_polarity_flip_physical{100.0}=0x0 +phy_chain_tx_polarity_flip_physical{101.0}=0x0 +phy_chain_tx_polarity_flip_physical{102.0}=0x1 +phy_chain_tx_polarity_flip_physical{103.0}=0x0 +phy_chain_tx_polarity_flip_physical{104.0}=0x0 +phy_chain_tx_polarity_flip_physical{105.0}=0x0 +phy_chain_tx_polarity_flip_physical{106.0}=0x1 +phy_chain_tx_polarity_flip_physical{107.0}=0x1 +phy_chain_tx_polarity_flip_physical{108.0}=0x1 +phy_chain_tx_polarity_flip_physical{109.0}=0x0 +phy_chain_tx_polarity_flip_physical{11.0}=0x1 +phy_chain_tx_polarity_flip_physical{110.0}=0x0 +phy_chain_tx_polarity_flip_physical{111.0}=0x0 +phy_chain_tx_polarity_flip_physical{112.0}=0x1 +phy_chain_tx_polarity_flip_physical{113.0}=0x1 +phy_chain_tx_polarity_flip_physical{114.0}=0x1 +phy_chain_tx_polarity_flip_physical{115.0}=0x1 +phy_chain_tx_polarity_flip_physical{116.0}=0x0 +phy_chain_tx_polarity_flip_physical{117.0}=0x1 +phy_chain_tx_polarity_flip_physical{118.0}=0x0 +phy_chain_tx_polarity_flip_physical{119.0}=0x0 +phy_chain_tx_polarity_flip_physical{12.0}=0x0 +phy_chain_tx_polarity_flip_physical{120.0}=0x0 +phy_chain_tx_polarity_flip_physical{121.0}=0x0 +phy_chain_tx_polarity_flip_physical{122.0}=0x0 +phy_chain_tx_polarity_flip_physical{123.0}=0x0 +phy_chain_tx_polarity_flip_physical{124.0}=0x1 +phy_chain_tx_polarity_flip_physical{125.0}=0x0 +phy_chain_tx_polarity_flip_physical{126.0}=0x1 +phy_chain_tx_polarity_flip_physical{127.0}=0x1 +phy_chain_tx_polarity_flip_physical{128.0}=0x1 +phy_chain_tx_polarity_flip_physical{129.0}=0x1 +phy_chain_tx_polarity_flip_physical{13.0}=0x0 +phy_chain_tx_polarity_flip_physical{130.0}=0x0 +phy_chain_tx_polarity_flip_physical{131.0}=0x1 +phy_chain_tx_polarity_flip_physical{132.0}=0x0 +phy_chain_tx_polarity_flip_physical{133.0}=0x1 +phy_chain_tx_polarity_flip_physical{134.0}=0x1 +phy_chain_tx_polarity_flip_physical{135.0}=0x1 +phy_chain_tx_polarity_flip_physical{136.0}=0x1 +phy_chain_tx_polarity_flip_physical{137.0}=0x1 +phy_chain_tx_polarity_flip_physical{138.0}=0x1 +phy_chain_tx_polarity_flip_physical{139.0}=0x1 +phy_chain_tx_polarity_flip_physical{14.0}=0x1 +phy_chain_tx_polarity_flip_physical{140.0}=0x1 +phy_chain_tx_polarity_flip_physical{141.0}=0x0 +phy_chain_tx_polarity_flip_physical{142.0}=0x1 +phy_chain_tx_polarity_flip_physical{143.0}=0x1 +phy_chain_tx_polarity_flip_physical{144.0}=0x1 +phy_chain_tx_polarity_flip_physical{145.0}=0x1 +phy_chain_tx_polarity_flip_physical{146.0}=0x1 +phy_chain_tx_polarity_flip_physical{147.0}=0x1 +phy_chain_tx_polarity_flip_physical{148.0}=0x0 +phy_chain_tx_polarity_flip_physical{149.0}=0x1 +phy_chain_tx_polarity_flip_physical{15.0}=0x0 +phy_chain_tx_polarity_flip_physical{150.0}=0x0 +phy_chain_tx_polarity_flip_physical{151.0}=0x0 +phy_chain_tx_polarity_flip_physical{152.0}=0x0 +phy_chain_tx_polarity_flip_physical{153.0}=0x1 +phy_chain_tx_polarity_flip_physical{154.0}=0x0 +phy_chain_tx_polarity_flip_physical{155.0}=0x0 +phy_chain_tx_polarity_flip_physical{156.0}=0x0 +phy_chain_tx_polarity_flip_physical{157.0}=0x0 +phy_chain_tx_polarity_flip_physical{158.0}=0x0 +phy_chain_tx_polarity_flip_physical{159.0}=0x0 +phy_chain_tx_polarity_flip_physical{16.0}=0x0 +phy_chain_tx_polarity_flip_physical{160.0}=0x0 +phy_chain_tx_polarity_flip_physical{161.0}=0x0 +phy_chain_tx_polarity_flip_physical{162.0}=0x1 +phy_chain_tx_polarity_flip_physical{163.0}=0x1 +phy_chain_tx_polarity_flip_physical{164.0}=0x0 +phy_chain_tx_polarity_flip_physical{165.0}=0x1 +phy_chain_tx_polarity_flip_physical{166.0}=0x1 +phy_chain_tx_polarity_flip_physical{167.0}=0x1 +phy_chain_tx_polarity_flip_physical{168.0}=0x0 +phy_chain_tx_polarity_flip_physical{169.0}=0x0 +phy_chain_tx_polarity_flip_physical{17.0}=0x0 +phy_chain_tx_polarity_flip_physical{170.0}=0x1 +phy_chain_tx_polarity_flip_physical{171.0}=0x1 +phy_chain_tx_polarity_flip_physical{172.0}=0x1 +phy_chain_tx_polarity_flip_physical{173.0}=0x0 +phy_chain_tx_polarity_flip_physical{174.0}=0x0 +phy_chain_tx_polarity_flip_physical{175.0}=0x1 +phy_chain_tx_polarity_flip_physical{176.0}=0x0 +phy_chain_tx_polarity_flip_physical{177.0}=0x1 +phy_chain_tx_polarity_flip_physical{178.0}=0x0 +phy_chain_tx_polarity_flip_physical{179.0}=0x0 +phy_chain_tx_polarity_flip_physical{18.0}=0x1 +phy_chain_tx_polarity_flip_physical{180.0}=0x0 +phy_chain_tx_polarity_flip_physical{181.0}=0x0 +phy_chain_tx_polarity_flip_physical{182.0}=0x0 +phy_chain_tx_polarity_flip_physical{183.0}=0x0 +phy_chain_tx_polarity_flip_physical{184.0}=0x1 +phy_chain_tx_polarity_flip_physical{185.0}=0x0 +phy_chain_tx_polarity_flip_physical{186.0}=0x1 +phy_chain_tx_polarity_flip_physical{187.0}=0x1 +phy_chain_tx_polarity_flip_physical{188.0}=0x1 +phy_chain_tx_polarity_flip_physical{189.0}=0x0 +phy_chain_tx_polarity_flip_physical{19.0}=0x1 +phy_chain_tx_polarity_flip_physical{190.0}=0x0 +phy_chain_tx_polarity_flip_physical{191.0}=0x0 +phy_chain_tx_polarity_flip_physical{192.0}=0x0 +phy_chain_tx_polarity_flip_physical{193.0}=0x1 +phy_chain_tx_polarity_flip_physical{194.0}=0x1 +phy_chain_tx_polarity_flip_physical{195.0}=0x1 +phy_chain_tx_polarity_flip_physical{196.0}=0x0 +phy_chain_tx_polarity_flip_physical{197.0}=0x0 +phy_chain_tx_polarity_flip_physical{198.0}=0x1 +phy_chain_tx_polarity_flip_physical{199.0}=0x1 +phy_chain_tx_polarity_flip_physical{2.0}=0x1 +phy_chain_tx_polarity_flip_physical{20.0}=0x1 +phy_chain_tx_polarity_flip_physical{200.0}=0x1 +phy_chain_tx_polarity_flip_physical{201.0}=0x1 +phy_chain_tx_polarity_flip_physical{202.0}=0x1 +phy_chain_tx_polarity_flip_physical{203.0}=0x1 +phy_chain_tx_polarity_flip_physical{204.0}=0x1 +phy_chain_tx_polarity_flip_physical{205.0}=0x0 +phy_chain_tx_polarity_flip_physical{206.0}=0x1 +phy_chain_tx_polarity_flip_physical{207.0}=0x1 +phy_chain_tx_polarity_flip_physical{208.0}=0x1 +phy_chain_tx_polarity_flip_physical{209.0}=0x1 +phy_chain_tx_polarity_flip_physical{21.0}=0x0 +phy_chain_tx_polarity_flip_physical{210.0}=0x1 +phy_chain_tx_polarity_flip_physical{211.0}=0x1 +phy_chain_tx_polarity_flip_physical{212.0}=0x0 +phy_chain_tx_polarity_flip_physical{213.0}=0x0 +phy_chain_tx_polarity_flip_physical{214.0}=0x1 +phy_chain_tx_polarity_flip_physical{215.0}=0x0 +phy_chain_tx_polarity_flip_physical{216.0}=0x1 +phy_chain_tx_polarity_flip_physical{217.0}=0x1 +phy_chain_tx_polarity_flip_physical{218.0}=0x1 +phy_chain_tx_polarity_flip_physical{219.0}=0x0 +phy_chain_tx_polarity_flip_physical{22.0}=0x0 +phy_chain_tx_polarity_flip_physical{220.0}=0x1 +phy_chain_tx_polarity_flip_physical{221.0}=0x0 +phy_chain_tx_polarity_flip_physical{222.0}=0x0 +phy_chain_tx_polarity_flip_physical{223.0}=0x0 +phy_chain_tx_polarity_flip_physical{224.0}=0x1 +phy_chain_tx_polarity_flip_physical{225.0}=0x1 +phy_chain_tx_polarity_flip_physical{226.0}=0x1 +phy_chain_tx_polarity_flip_physical{227.0}=0x1 +phy_chain_tx_polarity_flip_physical{228.0}=0x0 +phy_chain_tx_polarity_flip_physical{229.0}=0x0 +phy_chain_tx_polarity_flip_physical{23.0}=0x0 +phy_chain_tx_polarity_flip_physical{230.0}=0x1 +phy_chain_tx_polarity_flip_physical{231.0}=0x1 +phy_chain_tx_polarity_flip_physical{232.0}=0x1 +phy_chain_tx_polarity_flip_physical{233.0}=0x0 +phy_chain_tx_polarity_flip_physical{234.0}=0x0 +phy_chain_tx_polarity_flip_physical{235.0}=0x0 +phy_chain_tx_polarity_flip_physical{236.0}=0x0 +phy_chain_tx_polarity_flip_physical{237.0}=0x1 +phy_chain_tx_polarity_flip_physical{238.0}=0x1 +phy_chain_tx_polarity_flip_physical{239.0}=0x1 +phy_chain_tx_polarity_flip_physical{24.0}=0x0 +phy_chain_tx_polarity_flip_physical{240.0}=0x0 +phy_chain_tx_polarity_flip_physical{241.0}=0x1 +phy_chain_tx_polarity_flip_physical{242.0}=0x1 +phy_chain_tx_polarity_flip_physical{243.0}=0x1 +phy_chain_tx_polarity_flip_physical{244.0}=0x0 +phy_chain_tx_polarity_flip_physical{245.0}=0x1 +phy_chain_tx_polarity_flip_physical{246.0}=0x1 +phy_chain_tx_polarity_flip_physical{247.0}=0x1 +phy_chain_tx_polarity_flip_physical{248.0}=0x1 +phy_chain_tx_polarity_flip_physical{249.0}=0x1 +phy_chain_tx_polarity_flip_physical{25.0}=0x1 +phy_chain_tx_polarity_flip_physical{250.0}=0x0 +phy_chain_tx_polarity_flip_physical{251.0}=0x0 +phy_chain_tx_polarity_flip_physical{252.0}=0x0 +phy_chain_tx_polarity_flip_physical{253.0}=0x1 +phy_chain_tx_polarity_flip_physical{254.0}=0x1 +phy_chain_tx_polarity_flip_physical{255.0}=0x1 +phy_chain_tx_polarity_flip_physical{256.0}=0x0 +phy_chain_tx_polarity_flip_physical{257.0}=0x0 +phy_chain_tx_polarity_flip_physical{259.0}=0x0 +phy_chain_tx_polarity_flip_physical{26.0}=0x0 +phy_chain_tx_polarity_flip_physical{27.0}=0x0 +phy_chain_tx_polarity_flip_physical{28.0}=0x0 +phy_chain_tx_polarity_flip_physical{29.0}=0x1 +phy_chain_tx_polarity_flip_physical{3.0}=0x1 +phy_chain_tx_polarity_flip_physical{30.0}=0x1 +phy_chain_tx_polarity_flip_physical{31.0}=0x1 +phy_chain_tx_polarity_flip_physical{32.0}=0x0 +phy_chain_tx_polarity_flip_physical{33.0}=0x0 +phy_chain_tx_polarity_flip_physical{34.0}=0x0 +phy_chain_tx_polarity_flip_physical{35.0}=0x0 +phy_chain_tx_polarity_flip_physical{36.0}=0x1 +phy_chain_tx_polarity_flip_physical{37.0}=0x1 +phy_chain_tx_polarity_flip_physical{38.0}=0x1 +phy_chain_tx_polarity_flip_physical{39.0}=0x1 +phy_chain_tx_polarity_flip_physical{4.0}=0x1 +phy_chain_tx_polarity_flip_physical{40.0}=0x0 +phy_chain_tx_polarity_flip_physical{41.0}=0x0 +phy_chain_tx_polarity_flip_physical{42.0}=0x0 +phy_chain_tx_polarity_flip_physical{43.0}=0x0 +phy_chain_tx_polarity_flip_physical{44.0}=0x0 +phy_chain_tx_polarity_flip_physical{45.0}=0x1 +phy_chain_tx_polarity_flip_physical{46.0}=0x0 +phy_chain_tx_polarity_flip_physical{47.0}=0x1 +phy_chain_tx_polarity_flip_physical{48.0}=0x1 +phy_chain_tx_polarity_flip_physical{49.0}=0x0 +phy_chain_tx_polarity_flip_physical{5.0}=0x1 +phy_chain_tx_polarity_flip_physical{50.0}=0x0 +phy_chain_tx_polarity_flip_physical{51.0}=0x0 +phy_chain_tx_polarity_flip_physical{52.0}=0x1 +phy_chain_tx_polarity_flip_physical{53.0}=0x0 +phy_chain_tx_polarity_flip_physical{54.0}=0x1 +phy_chain_tx_polarity_flip_physical{55.0}=0x1 +phy_chain_tx_polarity_flip_physical{56.0}=0x0 +phy_chain_tx_polarity_flip_physical{57.0}=0x0 +phy_chain_tx_polarity_flip_physical{58.0}=0x1 +phy_chain_tx_polarity_flip_physical{59.0}=0x1 +phy_chain_tx_polarity_flip_physical{6.0}=0x1 +phy_chain_tx_polarity_flip_physical{60.0}=0x1 +phy_chain_tx_polarity_flip_physical{61.0}=0x0 +phy_chain_tx_polarity_flip_physical{62.0}=0x1 +phy_chain_tx_polarity_flip_physical{63.0}=0x1 +phy_chain_tx_polarity_flip_physical{64.0}=0x1 +phy_chain_tx_polarity_flip_physical{65.0}=0x0 +phy_chain_tx_polarity_flip_physical{66.0}=0x1 +phy_chain_tx_polarity_flip_physical{67.0}=0x1 +phy_chain_tx_polarity_flip_physical{68.0}=0x0 +phy_chain_tx_polarity_flip_physical{69.0}=0x1 +phy_chain_tx_polarity_flip_physical{7.0}=0x1 +phy_chain_tx_polarity_flip_physical{70.0}=0x1 +phy_chain_tx_polarity_flip_physical{71.0}=0x1 +phy_chain_tx_polarity_flip_physical{72.0}=0x0 +phy_chain_tx_polarity_flip_physical{73.0}=0x1 +phy_chain_tx_polarity_flip_physical{74.0}=0x0 +phy_chain_tx_polarity_flip_physical{75.0}=0x0 +phy_chain_tx_polarity_flip_physical{76.0}=0x0 +phy_chain_tx_polarity_flip_physical{77.0}=0x0 +phy_chain_tx_polarity_flip_physical{78.0}=0x0 +phy_chain_tx_polarity_flip_physical{79.0}=0x1 +phy_chain_tx_polarity_flip_physical{8.0}=0x0 +phy_chain_tx_polarity_flip_physical{80.0}=0x0 +phy_chain_tx_polarity_flip_physical{81.0}=0x1 +phy_chain_tx_polarity_flip_physical{82.0}=0x1 +phy_chain_tx_polarity_flip_physical{83.0}=0x1 +phy_chain_tx_polarity_flip_physical{84.0}=0x0 +phy_chain_tx_polarity_flip_physical{85.0}=0x1 +phy_chain_tx_polarity_flip_physical{86.0}=0x0 +phy_chain_tx_polarity_flip_physical{87.0}=0x0 +phy_chain_tx_polarity_flip_physical{88.0}=0x0 +phy_chain_tx_polarity_flip_physical{89.0}=0x1 +phy_chain_tx_polarity_flip_physical{9.0}=0x0 +phy_chain_tx_polarity_flip_physical{90.0}=0x1 +phy_chain_tx_polarity_flip_physical{91.0}=0x1 +phy_chain_tx_polarity_flip_physical{92.0}=0x0 +phy_chain_tx_polarity_flip_physical{93.0}=0x0 +phy_chain_tx_polarity_flip_physical{94.0}=0x0 +phy_chain_tx_polarity_flip_physical{95.0}=0x0 +phy_chain_tx_polarity_flip_physical{96.0}=0x0 +phy_chain_tx_polarity_flip_physical{97.0}=0x0 +phy_chain_tx_polarity_flip_physical{98.0}=0x1 +phy_chain_tx_polarity_flip_physical{99.0}=0x1 +port_init_autoneg_100=0 +port_init_autoneg_102=0 +port_init_autoneg_103=0 +port_init_autoneg_104=0 +port_init_autoneg_105=0 +port_init_autoneg_106=0 +port_init_autoneg_107=0 +port_init_autoneg_108=0 +port_init_autoneg_109=0 +port_init_autoneg_10=0 +port_init_autoneg_110=0 +port_init_autoneg_111=0 +port_init_autoneg_112=0 +port_init_autoneg_113=0 +port_init_autoneg_114=0 +port_init_autoneg_115=0 +port_init_autoneg_116=0 +port_init_autoneg_117=0 +port_init_autoneg_11=0 +port_init_autoneg_12=0 +port_init_autoneg_13=0 +port_init_autoneg_14=0 +port_init_autoneg_15=0 +port_init_autoneg_16=0 +port_init_autoneg_1=0 +port_init_autoneg_2=0 +port_init_autoneg_34=0 +port_init_autoneg_35=0 +port_init_autoneg_36=0 +port_init_autoneg_37=0 +port_init_autoneg_38=0 +port_init_autoneg_39=0 +port_init_autoneg_3=0 +port_init_autoneg_40=0 +port_init_autoneg_41=0 +port_init_autoneg_42=0 +port_init_autoneg_43=0 +port_init_autoneg_44=0 +port_init_autoneg_45=0 +port_init_autoneg_46=0 +port_init_autoneg_47=0 +port_init_autoneg_48=0 +port_init_autoneg_49=0 +port_init_autoneg_4=0 +port_init_autoneg_5=0 +port_init_autoneg_66=0 +port_init_autoneg_68=0 +port_init_autoneg_69=0 +port_init_autoneg_6=0 +port_init_autoneg_70=0 +port_init_autoneg_71=0 +port_init_autoneg_72=0 +port_init_autoneg_73=0 +port_init_autoneg_74=0 +port_init_autoneg_75=0 +port_init_autoneg_76=0 +port_init_autoneg_77=0 +port_init_autoneg_78=0 +port_init_autoneg_79=0 +port_init_autoneg_7=0 +port_init_autoneg_80=0 +port_init_autoneg_81=0 +port_init_autoneg_82=0 +port_init_autoneg_83=0 +port_init_autoneg_8=0 +port_init_autoneg_9=0 +port_init_cl72_hg=1 +port_phy_addr_100=0xff +port_phy_addr_102=0xff +port_phy_addr_103=0xff +port_phy_addr_104=0xff +port_phy_addr_105=0xff +port_phy_addr_106=0xff +port_phy_addr_107=0xff +port_phy_addr_108=0xff +port_phy_addr_109=0xff +port_phy_addr_10=0xff +port_phy_addr_110=0xff +port_phy_addr_111=0xff +port_phy_addr_112=0xff +port_phy_addr_113=0xff +port_phy_addr_114=0xff +port_phy_addr_115=0xff +port_phy_addr_116=0xff +port_phy_addr_117=0xff +port_phy_addr_11=0xff +port_phy_addr_12=0xff +port_phy_addr_13=0xff +port_phy_addr_14=0xff +port_phy_addr_15=0xff +port_phy_addr_16=0xff +port_phy_addr_1=0xff +port_phy_addr_2=0xff +port_phy_addr_34=0xff +port_phy_addr_35=0xff +port_phy_addr_36=0xff +port_phy_addr_37=0xff +port_phy_addr_38=0xff +port_phy_addr_39=0xff +port_phy_addr_3=0xff +port_phy_addr_40=0xff +port_phy_addr_41=0xff +port_phy_addr_42=0xff +port_phy_addr_43=0xff +port_phy_addr_44=0xff +port_phy_addr_45=0xff +port_phy_addr_46=0xff +port_phy_addr_47=0xff +port_phy_addr_48=0xff +port_phy_addr_49=0xff +port_phy_addr_4=0xff +port_phy_addr_5=0xff +port_phy_addr_66=0xff +port_phy_addr_68=0xff +port_phy_addr_69=0xff +port_phy_addr_6=0xff +port_phy_addr_70=0xff +port_phy_addr_71=0xff +port_phy_addr_72=0xff +port_phy_addr_73=0xff +port_phy_addr_74=0xff +port_phy_addr_75=0xff +port_phy_addr_76=0xff +port_phy_addr_77=0xff +port_phy_addr_78=0xff +port_phy_addr_79=0xff +port_phy_addr_7=0xff +port_phy_addr_80=0xff +port_phy_addr_81=0xff +port_phy_addr_82=0xff +port_phy_addr_83=0xff +port_phy_addr_8=0xff +port_phy_addr_9=0xff +portmap_100=259:10 +portmap_101=262:10 +portmap_102=217:100 +portmap_103=213:100 +portmap_104=229:100 +portmap_105=237:100 +portmap_106=249:100 +portmap_107=245:100 +portmap_108=209:100 +portmap_109=221:100 +portmap_10=29:100 +portmap_110=233:100 +portmap_111=225:100 +portmap_112=241:100 +portmap_113=253:100 +portmap_114=197:100 +portmap_115=205:100 +portmap_116=201:100 +portmap_117=193:100 +portmap_11=41:100 +portmap_12=33:100 +portmap_134=263:10 +portmap_13=57:100 +portmap_14=53:100 +portmap_15=49:100 +portmap_16=61:100 +portmap_1=5:100 +portmap_2=13:100 +portmap_33=260:10 +portmap_34=77:100 +portmap_35=65:100 +portmap_36=85:100 +portmap_37=89:100 +portmap_38=109:100 +portmap_39=97:100 +portmap_3=25:100 +portmap_40=69:100 +portmap_41=73:100 +portmap_42=93:100 +portmap_43=81:100 +portmap_44=101:100 +portmap_45=105:100 +portmap_46=117:100 +portmap_47=121:100 +portmap_48=125:100 +portmap_49=113:100 +portmap_4=21:100 +portmap_5=37:100 +portmap_66=257:10 +portmap_67=261:10 +portmap_68=149:100 +portmap_69=153:100 +portmap_6=45:100 +portmap_70=173:100 +portmap_71=161:100 +portmap_72=181:100 +portmap_73=185:100 +portmap_74=157:100 +portmap_75=145:100 +portmap_76=165:100 +portmap_77=169:100 +portmap_78=189:100 +portmap_79=177:100 +portmap_7=9:100 +portmap_80=141:100 +portmap_81=133:100 +portmap_82=129:100 +portmap_83=137:100 +portmap_8=1:100 +portmap_9=17:100 +robust_hash_disable_egress_vlan=1 +robust_hash_disable_mpls=1 +robust_hash_disable_vlan=1 +stable_size=0x5500000 +stable_size=0x5500000 +tdma_timeout_usec=15000000 +tslam_timeout_usec=15000000 + +# tuning parameters +serdes_preemphasis_1=0x184606 +serdes_preemphasis_2=0x164108 +serdes_preemphasis_3=0x164308 +serdes_preemphasis_4=0x144108 +serdes_preemphasis_5=0x144108 +serdes_preemphasis_6=0x164106 +serdes_preemphasis_7=0x184507 +serdes_preemphasis_8=0x184606 +serdes_preemphasis_9=0x184507 +serdes_preemphasis_10=0x194407 +serdes_preemphasis_11=0x194407 +serdes_preemphasis_12=0x184507 +serdes_preemphasis_13=0x144108 +serdes_preemphasis_14=0x144108 +serdes_preemphasis_15=0x194407 +serdes_preemphasis_16=0x194407 +serdes_preemphasis_34=0x184408 +serdes_preemphasis_35=0x184606 +serdes_preemphasis_36=0x164308 +serdes_preemphasis_37=0x184606 +serdes_preemphasis_38=0x164108 +serdes_preemphasis_39=0x184606 +serdes_preemphasis_40=0xe3206 +serdes_preemphasis_41=0xe3205 +serdes_preemphasis_42=0x103a06 +serdes_preemphasis_43=0xe3205 +serdes_preemphasis_44=0x184606 +serdes_preemphasis_45=0x184507 +serdes_preemphasis_46=0x144108 +serdes_preemphasis_47=0x103a07 +serdes_preemphasis_48=0x194407 +serdes_preemphasis_49=0x194407 +serdes_preemphasis_66=0x43004 +serdes_preemphasis_68=0x164308 +serdes_preemphasis_69=0x164408 +serdes_preemphasis_70=0xe3206 +serdes_preemphasis_71=0xe3205 +serdes_preemphasis_72=0xe3205 +serdes_preemphasis_73=0xe3206 +serdes_preemphasis_74=0x164108 +serdes_preemphasis_75=0x184606 +serdes_preemphasis_76=0x164608 +serdes_preemphasis_77=0x184507 +serdes_preemphasis_78=0x184507 +serdes_preemphasis_79=0x184606 +serdes_preemphasis_80=0x184606 +serdes_preemphasis_81=0x184407 +serdes_preemphasis_82=0x103706 +serdes_preemphasis_83=0x103706 +serdes_preemphasis_100=0x43004 +serdes_preemphasis_102=0x184408 +serdes_preemphasis_103=0x184606 +serdes_preemphasis_104=0x184606 +serdes_preemphasis_105=0x16410a +serdes_preemphasis_106=0x184408 +serdes_preemphasis_107=0x194308 +serdes_preemphasis_108=0x144108 +serdes_preemphasis_109=0x144108 +serdes_preemphasis_110=0x144108 +serdes_preemphasis_111=0x144108 +serdes_preemphasis_112=0x164608 +serdes_preemphasis_113=0x164608 +serdes_preemphasis_114=0x174507 +serdes_preemphasis_115=0x184606 +serdes_preemphasis_116=0x103706 +serdes_preemphasis_117=0x133c06 + +mmu_init_config="MSFT-TH2-Tier1" diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/BALANCED b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/BALANCED new file mode 120000 index 00000000000..a270c70ffc3 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/RDMA-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/RDMA-CENTRIC new file mode 120000 index 00000000000..8d1ec6d277a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/TCP-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/TCP-CENTRIC new file mode 120000 index 00000000000..7ee783aac6a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffer_ports_t0.j2 new file mode 100644 index 00000000000..3e209865c30 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffer_ports_t0.j2 @@ -0,0 +1,14 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,12) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(20,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(12,20) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 deleted file mode 100644 index 74579a022dc..00000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1,54 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,12) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(20,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(12,20) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "33329088", - "type": "ingress", - "mode": "dynamic", - "xoff": "7827456" - }, - "egress_lossy_pool": { - "size": "26663272", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "42349632", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "size":"0", - "static_th":"44302336" - }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossless_pool]", - "size":"0", - "static_th":"42349632" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1664", - "dynamic_th":"-1" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini deleted file mode 100644 index ed0005610b7..00000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini +++ /dev/null @@ -1,8 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 50000 5m 1248 1248 56160 -3 2496 - 100000 5m 1248 1248 96928 -3 2496 - 50000 40m 1248 1248 96096 -3 2496 - 100000 40m 1248 1248 177632 -3 2496 - 50000 300m 1248 1248 141856 -3 2496 - 100000 300m 1248 1248 268736 -3 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 deleted file mode 100644 index 3e548325ea3..00000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 +++ /dev/null @@ -1 +0,0 @@ -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile index 235f2423df8..166f5c5b6e1 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-112x50G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm index 3c2a343bf04..6e4c266b1db 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/th2-a7260cx3-64-112x50G+8x100G.config.bcm @@ -1,7 +1,7 @@ PHY_AN_ALLOW_PLL_CHANGE=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/BALANCED b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/BALANCED new file mode 120000 index 00000000000..a270c70ffc3 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/RDMA-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/RDMA-CENTRIC new file mode 120000 index 00000000000..8e2f798b6d2 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/RDMA-CENTRIC/ \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/TCP-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/TCP-CENTRIC new file mode 120000 index 00000000000..7ee783aac6a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffer_ports_t0.j2 new file mode 100644 index 00000000000..7e4518bae96 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffer_ports_t0.j2 @@ -0,0 +1,21 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,12) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(12,20) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(20,44) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(44,52) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(52,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers.json.j2 new file mode 100644 index 00000000000..e6e9e844469 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't0' %} +{%- include 'buffers_config.j2' %} + diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/port_config.ini new file mode 100644 index 00000000000..49bd6fd6885 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/port_config.ini @@ -0,0 +1,115 @@ +# name lanes alias index speed +Ethernet0 77,78 Ethernet1/1 1 50000 +Ethernet2 79,80 Ethernet1/3 1 50000 +Ethernet4 65,66 Ethernet2/1 2 50000 +Ethernet6 67,68 Ethernet2/3 2 50000 +Ethernet8 85,86 Ethernet3/1 3 50000 +Ethernet10 87,88 Ethernet3/3 3 50000 +Ethernet12 89,90 Ethernet4/1 4 50000 +Ethernet14 91,92 Ethernet4/3 4 50000 +Ethernet16 109,110 Ethernet5/1 5 50000 +Ethernet18 111,112 Ethernet5/3 5 50000 +Ethernet20 97,98 Ethernet6/1 6 50000 +Ethernet22 99,100 Ethernet6/3 6 50000 +Ethernet24 5,6 Ethernet7/1 7 50000 +Ethernet26 7,8 Ethernet7/3 7 50000 +Ethernet28 13,14 Ethernet8/1 8 50000 +Ethernet30 15,16 Ethernet8/3 8 50000 +Ethernet32 25,26 Ethernet9/1 9 50000 +Ethernet34 27,28 Ethernet9/3 9 50000 +Ethernet36 21,22 Ethernet10/1 10 50000 +Ethernet38 23,24 Ethernet10/3 10 50000 +Ethernet40 37,38 Ethernet11/1 11 50000 +Ethernet42 39,40 Ethernet11/3 11 50000 +Ethernet44 45,46 Ethernet12/1 12 50000 +Ethernet46 47,48 Ethernet12/3 12 50000 +Ethernet48 57,58,59,60 Ethernet13/1 13 100000 +Ethernet52 53,54,55,56 Ethernet14/1 14 100000 +Ethernet56 117,118,119,120 Ethernet15/1 15 100000 +Ethernet60 121,122,123,124 Ethernet16/1 16 100000 +Ethernet64 141,142,143,144 Ethernet17/1 17 100000 +Ethernet68 133,134,135,136 Ethernet18/1 18 100000 +Ethernet72 197,198,199,200 Ethernet19/1 19 100000 +Ethernet76 205,206,207,208 Ethernet20/1 20 100000 +Ethernet80 217,218 Ethernet21/1 21 50000 +Ethernet82 219,220 Ethernet21/3 21 50000 +Ethernet84 213,214 Ethernet22/1 22 50000 +Ethernet86 215,216 Ethernet22/3 22 50000 +Ethernet88 229,230 Ethernet23/1 23 50000 +Ethernet90 231,232 Ethernet23/3 23 50000 +Ethernet92 237,238 Ethernet24/1 24 50000 +Ethernet94 239,240 Ethernet24/3 24 50000 +Ethernet96 249,250 Ethernet25/1 25 50000 +Ethernet98 251,252 Ethernet25/3 25 50000 +Ethernet100 245,246 Ethernet26/1 26 50000 +Ethernet102 247,248 Ethernet26/3 26 50000 +Ethernet104 149,150 Ethernet27/1 27 50000 +Ethernet106 151,152 Ethernet27/3 27 50000 +Ethernet108 153,154 Ethernet28/1 28 50000 +Ethernet110 155,156 Ethernet28/3 28 50000 +Ethernet112 173,174 Ethernet29/1 29 50000 +Ethernet114 175,176 Ethernet29/3 29 50000 +Ethernet116 161,162 Ethernet30/1 30 50000 +Ethernet118 163,164 Ethernet30/3 30 50000 +Ethernet120 181,182 Ethernet31/1 31 50000 +Ethernet122 183,184 Ethernet31/3 31 50000 +Ethernet124 185,186 Ethernet32/1 32 50000 +Ethernet126 187,188 Ethernet32/3 32 50000 +Ethernet128 69,70 Ethernet33/1 33 50000 +Ethernet130 71,72 Ethernet33/3 33 50000 +Ethernet132 73,74 Ethernet34/1 34 50000 +Ethernet134 75,76 Ethernet34/3 34 50000 +Ethernet136 93,94 Ethernet35/1 35 50000 +Ethernet138 95,96 Ethernet35/3 35 50000 +Ethernet140 81,82 Ethernet36/1 36 50000 +Ethernet142 83,84 Ethernet36/3 36 50000 +Ethernet144 101,102 Ethernet37/1 37 50000 +Ethernet146 103,104 Ethernet37/3 37 50000 +Ethernet148 105,106 Ethernet38/1 38 50000 +Ethernet150 107,108 Ethernet38/3 38 50000 +Ethernet152 9,10 Ethernet39/1 39 50000 +Ethernet154 11,12 Ethernet39/3 39 50000 +Ethernet156 1,2 Ethernet40/1 40 50000 +Ethernet158 3,4 Ethernet40/3 40 50000 +Ethernet160 17,18 Ethernet41/1 41 50000 +Ethernet162 19,20 Ethernet41/3 41 50000 +Ethernet164 29,30 Ethernet42/1 42 50000 +Ethernet166 31,32 Ethernet42/3 42 50000 +Ethernet168 41,42 Ethernet43/1 43 50000 +Ethernet170 43,44 Ethernet43/3 43 50000 +Ethernet172 33,34 Ethernet44/1 44 50000 +Ethernet174 35,36 Ethernet44/3 44 50000 +Ethernet176 49,50,51,52 Ethernet45/1 45 100000 +Ethernet180 61,62,63,64 Ethernet46/1 46 100000 +Ethernet184 125,126,127,128 Ethernet47/1 47 100000 +Ethernet188 113,114,115,116 Ethernet48/1 48 100000 +Ethernet192 129,130,131,132 Ethernet49/1 49 100000 +Ethernet196 137,138,139,140 Ethernet50/1 50 100000 +Ethernet200 201,202,203,204 Ethernet51/1 51 100000 +Ethernet204 193,194,195,196 Ethernet52/1 52 100000 +Ethernet208 209,210 Ethernet53/1 53 50000 +Ethernet210 211,212 Ethernet53/3 53 50000 +Ethernet212 221,222 Ethernet54/1 54 50000 +Ethernet214 223,224 Ethernet54/3 54 50000 +Ethernet216 233,234 Ethernet55/1 55 50000 +Ethernet218 235,236 Ethernet55/3 55 50000 +Ethernet220 225,226 Ethernet56/1 56 50000 +Ethernet222 227,228 Ethernet56/3 56 50000 +Ethernet224 241,242 Ethernet57/1 57 50000 +Ethernet226 243,244 Ethernet57/3 57 50000 +Ethernet228 253,254 Ethernet58/1 58 50000 +Ethernet230 255,256 Ethernet58/3 58 50000 +Ethernet232 157,158 Ethernet59/1 59 50000 +Ethernet234 159,160 Ethernet59/3 59 50000 +Ethernet236 145,146 Ethernet60/1 60 50000 +Ethernet238 147,148 Ethernet60/3 60 50000 +Ethernet240 165,166 Ethernet61/1 61 50000 +Ethernet242 167,168 Ethernet61/3 61 50000 +Ethernet244 169,170 Ethernet62/1 62 50000 +Ethernet246 171,172 Ethernet62/3 62 50000 +Ethernet248 189,190 Ethernet63/1 63 50000 +Ethernet250 191,192 Ethernet63/3 63 50000 +Ethernet252 177,178 Ethernet64/1 64 50000 +Ethernet254 179,180 Ethernet64/3 64 50000 +Ethernet256 257 Ethernet65 65 10000 +Ethernet260 259 Ethernet66 66 10000 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/sai.profile new file mode 100644 index 00000000000..d18e31d2c2a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-96x50G+16x100G.config.bcm diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/th2-a7260cx3-64-96x50G+16x100G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/th2-a7260cx3-64-96x50G+16x100G.config.bcm new file mode 100644 index 00000000000..9bc6ae7fc9d --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D96C16/th2-a7260cx3-64-96x50G+16x100G.config.bcm @@ -0,0 +1,920 @@ +PHY_AN_ALLOW_PLL_CHANGE=1 +arl_clean_timeout_usec=15000000 +asf_mem_profile=2 +bcm_num_cos=8 +bcm_stat_flags=1 +bcm_stat_jumbo=9236 +cdma_timeout_usec=15000000 +core_clock_frequency=1700 +dma_desc_timeout_usec=15000000 +dpp_clock_ratio=2:3 +higig2_hdr_mode=1 +ipv6_lpm_128b_enable=1 +l3_alpm_enable=2 +lpm_scaling_enable=0 +l2xmsg_mode=1 +max_vp_lags=0 +mem_scan_enable=1 +miim_intr_enable=0 +module_64ports=1 +os=unix +oversubscribe_mode=1 +pbmp_xport_xe=0xfffffffd3fffffff4fffffffc7ffffffe +#pbmp_xport_xe=0x47fffffff1fffffffcfffffffe7ffffffe +phy_an_allow_pll_change_hg=0 +phy_an_c73=1 +phy_chain_rx_lane_map_physical{1.0}=0x3210 +phy_chain_rx_lane_map_physical{101.0}=0x0123 +phy_chain_rx_lane_map_physical{105.0}=0x0123 +phy_chain_rx_lane_map_physical{109.0}=0x0123 +phy_chain_rx_lane_map_physical{113.0}=0x2301 +phy_chain_rx_lane_map_physical{117.0}=0x3210 +phy_chain_rx_lane_map_physical{121.0}=0x3210 +phy_chain_rx_lane_map_physical{125.0}=0x1203 +phy_chain_rx_lane_map_physical{129.0}=0x3210 +phy_chain_rx_lane_map_physical{13.0}=0x0321 +phy_chain_rx_lane_map_physical{133.0}=0x1032 +phy_chain_rx_lane_map_physical{137.0}=0x3210 +phy_chain_rx_lane_map_physical{141.0}=0x0123 +phy_chain_rx_lane_map_physical{145.0}=0x3210 +phy_chain_rx_lane_map_physical{149.0}=0x2310 +phy_chain_rx_lane_map_physical{153.0}=0x0132 +phy_chain_rx_lane_map_physical{157.0}=0x1302 +phy_chain_rx_lane_map_physical{161.0}=0x3021 +phy_chain_rx_lane_map_physical{165.0}=0x2031 +phy_chain_rx_lane_map_physical{169.0}=0x2031 +phy_chain_rx_lane_map_physical{17.0}=0x3210 +phy_chain_rx_lane_map_physical{173.0}=0x1302 +phy_chain_rx_lane_map_physical{177.0}=0x2031 +phy_chain_rx_lane_map_physical{181.0}=0x0213 +phy_chain_rx_lane_map_physical{185.0}=0x0213 +phy_chain_rx_lane_map_physical{189.0}=0x1302 +phy_chain_rx_lane_map_physical{193.0}=0x3120 +phy_chain_rx_lane_map_physical{197.0}=0x0231 +phy_chain_rx_lane_map_physical{201.0}=0x2031 +phy_chain_rx_lane_map_physical{205.0}=0x0213 +phy_chain_rx_lane_map_physical{209.0}=0x2013 +phy_chain_rx_lane_map_physical{21.0}=0x3021 +phy_chain_rx_lane_map_physical{213.0}=0x3021 +phy_chain_rx_lane_map_physical{217.0}=0x0231 +phy_chain_rx_lane_map_physical{221.0}=0x2031 +phy_chain_rx_lane_map_physical{225.0}=0x1203 +phy_chain_rx_lane_map_physical{229.0}=0x1230 +phy_chain_rx_lane_map_physical{233.0}=0x3021 +phy_chain_rx_lane_map_physical{237.0}=0x1032 +phy_chain_rx_lane_map_physical{241.0}=0x2301 +phy_chain_rx_lane_map_physical{245.0}=0x0321 +phy_chain_rx_lane_map_physical{249.0}=0x2301 +phy_chain_rx_lane_map_physical{25.0}=0x2301 +phy_chain_rx_lane_map_physical{253.0}=0x2301 +phy_chain_rx_lane_map_physical{257.0}=0x3210 +phy_chain_rx_lane_map_physical{29.0}=0x3021 +phy_chain_rx_lane_map_physical{33.0}=0x1302 +phy_chain_rx_lane_map_physical{37.0}=0x2031 +phy_chain_rx_lane_map_physical{41.0}=0x3021 +phy_chain_rx_lane_map_physical{45.0}=0x1023 +phy_chain_rx_lane_map_physical{49.0}=0x0213 +phy_chain_rx_lane_map_physical{5.0}=0x3201 +phy_chain_rx_lane_map_physical{53.0}=0x3201 +phy_chain_rx_lane_map_physical{57.0}=0x2013 +phy_chain_rx_lane_map_physical{61.0}=0x0213 +phy_chain_rx_lane_map_physical{65.0}=0x1203 +phy_chain_rx_lane_map_physical{69.0}=0x0213 +phy_chain_rx_lane_map_physical{73.0}=0x0213 +phy_chain_rx_lane_map_physical{77.0}=0x3120 +phy_chain_rx_lane_map_physical{81.0}=0x0213 +phy_chain_rx_lane_map_physical{85.0}=0x2031 +phy_chain_rx_lane_map_physical{89.0}=0x2031 +phy_chain_rx_lane_map_physical{9.0}=0x0321 +phy_chain_rx_lane_map_physical{93.0}=0x3120 +phy_chain_rx_lane_map_physical{97.0}=0x1203 +phy_chain_rx_polarity_flip_physical{1.0}=0x1 +phy_chain_rx_polarity_flip_physical{10.0}=0x0 +phy_chain_rx_polarity_flip_physical{100.0}=0x1 +phy_chain_rx_polarity_flip_physical{101.0}=0x1 +phy_chain_rx_polarity_flip_physical{102.0}=0x0 +phy_chain_rx_polarity_flip_physical{103.0}=0x1 +phy_chain_rx_polarity_flip_physical{104.0}=0x0 +phy_chain_rx_polarity_flip_physical{105.0}=0x1 +phy_chain_rx_polarity_flip_physical{106.0}=0x0 +phy_chain_rx_polarity_flip_physical{107.0}=0x1 +phy_chain_rx_polarity_flip_physical{108.0}=0x0 +phy_chain_rx_polarity_flip_physical{109.0}=0x0 +phy_chain_rx_polarity_flip_physical{11.0}=0x1 +phy_chain_rx_polarity_flip_physical{110.0}=0x1 +phy_chain_rx_polarity_flip_physical{111.0}=0x0 +phy_chain_rx_polarity_flip_physical{112.0}=0x1 +phy_chain_rx_polarity_flip_physical{113.0}=0x1 +phy_chain_rx_polarity_flip_physical{114.0}=0x0 +phy_chain_rx_polarity_flip_physical{115.0}=0x1 +phy_chain_rx_polarity_flip_physical{116.0}=0x0 +phy_chain_rx_polarity_flip_physical{117.0}=0x0 +phy_chain_rx_polarity_flip_physical{118.0}=0x0 +phy_chain_rx_polarity_flip_physical{119.0}=0x1 +phy_chain_rx_polarity_flip_physical{12.0}=0x1 +phy_chain_rx_polarity_flip_physical{120.0}=0x0 +phy_chain_rx_polarity_flip_physical{121.0}=0x1 +phy_chain_rx_polarity_flip_physical{122.0}=0x0 +phy_chain_rx_polarity_flip_physical{123.0}=0x1 +phy_chain_rx_polarity_flip_physical{124.0}=0x0 +phy_chain_rx_polarity_flip_physical{125.0}=0x0 +phy_chain_rx_polarity_flip_physical{126.0}=0x1 +phy_chain_rx_polarity_flip_physical{127.0}=0x1 +phy_chain_rx_polarity_flip_physical{128.0}=0x1 +phy_chain_rx_polarity_flip_physical{129.0}=0x0 +phy_chain_rx_polarity_flip_physical{13.0}=0x1 +phy_chain_rx_polarity_flip_physical{130.0}=0x1 +phy_chain_rx_polarity_flip_physical{131.0}=0x1 +phy_chain_rx_polarity_flip_physical{132.0}=0x0 +phy_chain_rx_polarity_flip_physical{133.0}=0x1 +phy_chain_rx_polarity_flip_physical{134.0}=0x1 +phy_chain_rx_polarity_flip_physical{135.0}=0x1 +phy_chain_rx_polarity_flip_physical{136.0}=0x0 +phy_chain_rx_polarity_flip_physical{137.0}=0x0 +phy_chain_rx_polarity_flip_physical{138.0}=0x0 +phy_chain_rx_polarity_flip_physical{139.0}=0x1 +phy_chain_rx_polarity_flip_physical{14.0}=0x0 +phy_chain_rx_polarity_flip_physical{140.0}=0x0 +phy_chain_rx_polarity_flip_physical{141.0}=0x1 +phy_chain_rx_polarity_flip_physical{142.0}=0x0 +phy_chain_rx_polarity_flip_physical{143.0}=0x1 +phy_chain_rx_polarity_flip_physical{144.0}=0x0 +phy_chain_rx_polarity_flip_physical{145.0}=0x1 +phy_chain_rx_polarity_flip_physical{146.0}=0x0 +phy_chain_rx_polarity_flip_physical{147.0}=0x1 +phy_chain_rx_polarity_flip_physical{148.0}=0x0 +phy_chain_rx_polarity_flip_physical{149.0}=0x0 +phy_chain_rx_polarity_flip_physical{15.0}=0x1 +phy_chain_rx_polarity_flip_physical{150.0}=0x1 +phy_chain_rx_polarity_flip_physical{151.0}=0x1 +phy_chain_rx_polarity_flip_physical{152.0}=0x0 +phy_chain_rx_polarity_flip_physical{153.0}=0x0 +phy_chain_rx_polarity_flip_physical{154.0}=0x1 +phy_chain_rx_polarity_flip_physical{155.0}=0x1 +phy_chain_rx_polarity_flip_physical{156.0}=0x0 +phy_chain_rx_polarity_flip_physical{157.0}=0x0 +phy_chain_rx_polarity_flip_physical{158.0}=0x0 +phy_chain_rx_polarity_flip_physical{159.0}=0x1 +phy_chain_rx_polarity_flip_physical{16.0}=0x0 +phy_chain_rx_polarity_flip_physical{160.0}=0x0 +phy_chain_rx_polarity_flip_physical{161.0}=0x1 +phy_chain_rx_polarity_flip_physical{162.0}=0x1 +phy_chain_rx_polarity_flip_physical{163.0}=0x0 +phy_chain_rx_polarity_flip_physical{164.0}=0x1 +phy_chain_rx_polarity_flip_physical{165.0}=0x0 +phy_chain_rx_polarity_flip_physical{166.0}=0x0 +phy_chain_rx_polarity_flip_physical{167.0}=0x1 +phy_chain_rx_polarity_flip_physical{168.0}=0x1 +phy_chain_rx_polarity_flip_physical{169.0}=0x1 +phy_chain_rx_polarity_flip_physical{17.0}=0x1 +phy_chain_rx_polarity_flip_physical{170.0}=0x1 +phy_chain_rx_polarity_flip_physical{171.0}=0x0 +phy_chain_rx_polarity_flip_physical{172.0}=0x0 +phy_chain_rx_polarity_flip_physical{173.0}=0x0 +phy_chain_rx_polarity_flip_physical{174.0}=0x0 +phy_chain_rx_polarity_flip_physical{175.0}=0x1 +phy_chain_rx_polarity_flip_physical{176.0}=0x1 +phy_chain_rx_polarity_flip_physical{177.0}=0x1 +phy_chain_rx_polarity_flip_physical{178.0}=0x1 +phy_chain_rx_polarity_flip_physical{179.0}=0x0 +phy_chain_rx_polarity_flip_physical{18.0}=0x0 +phy_chain_rx_polarity_flip_physical{180.0}=0x0 +phy_chain_rx_polarity_flip_physical{181.0}=0x1 +phy_chain_rx_polarity_flip_physical{182.0}=0x1 +phy_chain_rx_polarity_flip_physical{183.0}=0x0 +phy_chain_rx_polarity_flip_physical{184.0}=0x0 +phy_chain_rx_polarity_flip_physical{185.0}=0x0 +phy_chain_rx_polarity_flip_physical{186.0}=0x0 +phy_chain_rx_polarity_flip_physical{187.0}=0x1 +phy_chain_rx_polarity_flip_physical{188.0}=0x1 +phy_chain_rx_polarity_flip_physical{189.0}=0x0 +phy_chain_rx_polarity_flip_physical{19.0}=0x1 +phy_chain_rx_polarity_flip_physical{190.0}=0x0 +phy_chain_rx_polarity_flip_physical{191.0}=0x1 +phy_chain_rx_polarity_flip_physical{192.0}=0x0 +phy_chain_rx_polarity_flip_physical{193.0}=0x0 +phy_chain_rx_polarity_flip_physical{194.0}=0x0 +phy_chain_rx_polarity_flip_physical{195.0}=0x1 +phy_chain_rx_polarity_flip_physical{196.0}=0x1 +phy_chain_rx_polarity_flip_physical{197.0}=0x1 +phy_chain_rx_polarity_flip_physical{198.0}=0x1 +phy_chain_rx_polarity_flip_physical{199.0}=0x0 +phy_chain_rx_polarity_flip_physical{2.0}=0x0 +phy_chain_rx_polarity_flip_physical{20.0}=0x0 +phy_chain_rx_polarity_flip_physical{200.0}=0x0 +phy_chain_rx_polarity_flip_physical{201.0}=0x0 +phy_chain_rx_polarity_flip_physical{202.0}=0x0 +phy_chain_rx_polarity_flip_physical{203.0}=0x1 +phy_chain_rx_polarity_flip_physical{204.0}=0x0 +phy_chain_rx_polarity_flip_physical{205.0}=0x1 +phy_chain_rx_polarity_flip_physical{206.0}=0x1 +phy_chain_rx_polarity_flip_physical{207.0}=0x0 +phy_chain_rx_polarity_flip_physical{208.0}=0x0 +phy_chain_rx_polarity_flip_physical{209.0}=0x1 +phy_chain_rx_polarity_flip_physical{21.0}=0x0 +phy_chain_rx_polarity_flip_physical{210.0}=0x1 +phy_chain_rx_polarity_flip_physical{211.0}=0x0 +phy_chain_rx_polarity_flip_physical{212.0}=0x0 +phy_chain_rx_polarity_flip_physical{213.0}=0x0 +phy_chain_rx_polarity_flip_physical{214.0}=0x0 +phy_chain_rx_polarity_flip_physical{215.0}=0x1 +phy_chain_rx_polarity_flip_physical{216.0}=0x0 +phy_chain_rx_polarity_flip_physical{217.0}=0x0 +phy_chain_rx_polarity_flip_physical{218.0}=0x0 +phy_chain_rx_polarity_flip_physical{219.0}=0x1 +phy_chain_rx_polarity_flip_physical{22.0}=0x0 +phy_chain_rx_polarity_flip_physical{220.0}=0x1 +phy_chain_rx_polarity_flip_physical{221.0}=0x0 +phy_chain_rx_polarity_flip_physical{222.0}=0x0 +phy_chain_rx_polarity_flip_physical{223.0}=0x1 +phy_chain_rx_polarity_flip_physical{224.0}=0x1 +phy_chain_rx_polarity_flip_physical{225.0}=0x1 +phy_chain_rx_polarity_flip_physical{226.0}=0x0 +phy_chain_rx_polarity_flip_physical{227.0}=0x0 +phy_chain_rx_polarity_flip_physical{228.0}=0x1 +phy_chain_rx_polarity_flip_physical{229.0}=0x0 +phy_chain_rx_polarity_flip_physical{23.0}=0x1 +phy_chain_rx_polarity_flip_physical{230.0}=0x0 +phy_chain_rx_polarity_flip_physical{231.0}=0x1 +phy_chain_rx_polarity_flip_physical{232.0}=0x1 +phy_chain_rx_polarity_flip_physical{233.0}=0x1 +phy_chain_rx_polarity_flip_physical{234.0}=0x0 +phy_chain_rx_polarity_flip_physical{235.0}=0x0 +phy_chain_rx_polarity_flip_physical{236.0}=0x0 +phy_chain_rx_polarity_flip_physical{237.0}=0x1 +phy_chain_rx_polarity_flip_physical{238.0}=0x0 +phy_chain_rx_polarity_flip_physical{239.0}=0x1 +phy_chain_rx_polarity_flip_physical{24.0}=0x0 +phy_chain_rx_polarity_flip_physical{240.0}=0x0 +phy_chain_rx_polarity_flip_physical{241.0}=0x1 +phy_chain_rx_polarity_flip_physical{242.0}=0x0 +phy_chain_rx_polarity_flip_physical{243.0}=0x1 +phy_chain_rx_polarity_flip_physical{244.0}=0x0 +phy_chain_rx_polarity_flip_physical{245.0}=0x1 +phy_chain_rx_polarity_flip_physical{246.0}=0x1 +phy_chain_rx_polarity_flip_physical{247.0}=0x1 +phy_chain_rx_polarity_flip_physical{248.0}=0x0 +phy_chain_rx_polarity_flip_physical{249.0}=0x0 +phy_chain_rx_polarity_flip_physical{25.0}=0x1 +phy_chain_rx_polarity_flip_physical{250.0}=0x1 +phy_chain_rx_polarity_flip_physical{251.0}=0x0 +phy_chain_rx_polarity_flip_physical{252.0}=0x1 +phy_chain_rx_polarity_flip_physical{253.0}=0x1 +phy_chain_rx_polarity_flip_physical{254.0}=0x0 +phy_chain_rx_polarity_flip_physical{255.0}=0x1 +phy_chain_rx_polarity_flip_physical{256.0}=0x0 +phy_chain_rx_polarity_flip_physical{257.0}=0x0 +phy_chain_rx_polarity_flip_physical{259.0}=0x0 +phy_chain_rx_polarity_flip_physical{26.0}=0x0 +phy_chain_rx_polarity_flip_physical{27.0}=0x1 +phy_chain_rx_polarity_flip_physical{28.0}=0x0 +phy_chain_rx_polarity_flip_physical{29.0}=0x0 +phy_chain_rx_polarity_flip_physical{3.0}=0x1 +phy_chain_rx_polarity_flip_physical{30.0}=0x0 +phy_chain_rx_polarity_flip_physical{31.0}=0x0 +phy_chain_rx_polarity_flip_physical{32.0}=0x1 +phy_chain_rx_polarity_flip_physical{33.0}=0x0 +phy_chain_rx_polarity_flip_physical{34.0}=0x0 +phy_chain_rx_polarity_flip_physical{35.0}=0x1 +phy_chain_rx_polarity_flip_physical{36.0}=0x1 +phy_chain_rx_polarity_flip_physical{37.0}=0x1 +phy_chain_rx_polarity_flip_physical{38.0}=0x1 +phy_chain_rx_polarity_flip_physical{39.0}=0x0 +phy_chain_rx_polarity_flip_physical{4.0}=0x0 +phy_chain_rx_polarity_flip_physical{40.0}=0x0 +phy_chain_rx_polarity_flip_physical{41.0}=0x0 +phy_chain_rx_polarity_flip_physical{42.0}=0x1 +phy_chain_rx_polarity_flip_physical{43.0}=0x1 +phy_chain_rx_polarity_flip_physical{44.0}=0x1 +phy_chain_rx_polarity_flip_physical{45.0}=0x1 +phy_chain_rx_polarity_flip_physical{46.0}=0x0 +phy_chain_rx_polarity_flip_physical{47.0}=0x0 +phy_chain_rx_polarity_flip_physical{48.0}=0x1 +phy_chain_rx_polarity_flip_physical{49.0}=0x1 +phy_chain_rx_polarity_flip_physical{5.0}=0x1 +phy_chain_rx_polarity_flip_physical{50.0}=0x1 +phy_chain_rx_polarity_flip_physical{51.0}=0x0 +phy_chain_rx_polarity_flip_physical{52.0}=0x0 +phy_chain_rx_polarity_flip_physical{53.0}=0x0 +phy_chain_rx_polarity_flip_physical{54.0}=0x0 +phy_chain_rx_polarity_flip_physical{55.0}=0x1 +phy_chain_rx_polarity_flip_physical{56.0}=0x0 +phy_chain_rx_polarity_flip_physical{57.0}=0x0 +phy_chain_rx_polarity_flip_physical{58.0}=0x0 +phy_chain_rx_polarity_flip_physical{59.0}=0x1 +phy_chain_rx_polarity_flip_physical{6.0}=0x0 +phy_chain_rx_polarity_flip_physical{60.0}=0x1 +phy_chain_rx_polarity_flip_physical{61.0}=0x0 +phy_chain_rx_polarity_flip_physical{62.0}=0x0 +phy_chain_rx_polarity_flip_physical{63.0}=0x1 +phy_chain_rx_polarity_flip_physical{64.0}=0x1 +phy_chain_rx_polarity_flip_physical{65.0}=0x1 +phy_chain_rx_polarity_flip_physical{66.0}=0x1 +phy_chain_rx_polarity_flip_physical{67.0}=0x0 +phy_chain_rx_polarity_flip_physical{68.0}=0x1 +phy_chain_rx_polarity_flip_physical{69.0}=0x0 +phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_rx_polarity_flip_physical{70.0}=0x0 +phy_chain_rx_polarity_flip_physical{71.0}=0x1 +phy_chain_rx_polarity_flip_physical{72.0}=0x1 +phy_chain_rx_polarity_flip_physical{73.0}=0x1 +phy_chain_rx_polarity_flip_physical{74.0}=0x1 +phy_chain_rx_polarity_flip_physical{75.0}=0x0 +phy_chain_rx_polarity_flip_physical{76.0}=0x0 +phy_chain_rx_polarity_flip_physical{77.0}=0x0 +phy_chain_rx_polarity_flip_physical{78.0}=0x0 +phy_chain_rx_polarity_flip_physical{79.0}=0x1 +phy_chain_rx_polarity_flip_physical{8.0}=0x1 +phy_chain_rx_polarity_flip_physical{80.0}=0x1 +phy_chain_rx_polarity_flip_physical{81.0}=0x1 +phy_chain_rx_polarity_flip_physical{82.0}=0x1 +phy_chain_rx_polarity_flip_physical{83.0}=0x0 +phy_chain_rx_polarity_flip_physical{84.0}=0x0 +phy_chain_rx_polarity_flip_physical{85.0}=0x1 +phy_chain_rx_polarity_flip_physical{86.0}=0x1 +phy_chain_rx_polarity_flip_physical{87.0}=0x0 +phy_chain_rx_polarity_flip_physical{88.0}=0x0 +phy_chain_rx_polarity_flip_physical{89.0}=0x0 +phy_chain_rx_polarity_flip_physical{9.0}=0x1 +phy_chain_rx_polarity_flip_physical{90.0}=0x0 +phy_chain_rx_polarity_flip_physical{91.0}=0x1 +phy_chain_rx_polarity_flip_physical{92.0}=0x1 +phy_chain_rx_polarity_flip_physical{93.0}=0x0 +phy_chain_rx_polarity_flip_physical{94.0}=0x0 +phy_chain_rx_polarity_flip_physical{95.0}=0x1 +phy_chain_rx_polarity_flip_physical{96.0}=0x0 +phy_chain_rx_polarity_flip_physical{97.0}=0x1 +phy_chain_rx_polarity_flip_physical{98.0}=0x1 +phy_chain_rx_polarity_flip_physical{99.0}=0x0 +phy_chain_tx_lane_map_physical{1.0}=0x2031 +phy_chain_tx_lane_map_physical{101.0}=0x1023 +phy_chain_tx_lane_map_physical{105.0}=0x1302 +phy_chain_tx_lane_map_physical{109.0}=0x0321 +phy_chain_tx_lane_map_physical{113.0}=0x2301 +phy_chain_tx_lane_map_physical{117.0}=0x3120 +phy_chain_tx_lane_map_physical{121.0}=0x3102 +phy_chain_tx_lane_map_physical{125.0}=0x3210 +phy_chain_tx_lane_map_physical{129.0}=0x1023 +phy_chain_tx_lane_map_physical{13.0}=0x3021 +phy_chain_tx_lane_map_physical{133.0}=0x3210 +phy_chain_tx_lane_map_physical{137.0}=0x2031 +phy_chain_tx_lane_map_physical{141.0}=0x1302 +phy_chain_tx_lane_map_physical{145.0}=0x3210 +phy_chain_tx_lane_map_physical{149.0}=0x0213 +phy_chain_tx_lane_map_physical{153.0}=0x3210 +phy_chain_tx_lane_map_physical{157.0}=0x1320 +phy_chain_tx_lane_map_physical{161.0}=0x3210 +phy_chain_tx_lane_map_physical{165.0}=0x0231 +phy_chain_tx_lane_map_physical{169.0}=0x3120 +phy_chain_tx_lane_map_physical{17.0}=0x1032 +phy_chain_tx_lane_map_physical{173.0}=0x0312 +phy_chain_tx_lane_map_physical{177.0}=0x0231 +phy_chain_tx_lane_map_physical{181.0}=0x3210 +phy_chain_tx_lane_map_physical{185.0}=0x3210 +phy_chain_tx_lane_map_physical{189.0}=0x1320 +phy_chain_tx_lane_map_physical{193.0}=0x0321 +phy_chain_tx_lane_map_physical{197.0}=0x3120 +phy_chain_tx_lane_map_physical{201.0}=0x3120 +phy_chain_tx_lane_map_physical{205.0}=0x0123 +phy_chain_tx_lane_map_physical{209.0}=0x3120 +phy_chain_tx_lane_map_physical{21.0}=0x0213 +phy_chain_tx_lane_map_physical{213.0}=0x3021 +phy_chain_tx_lane_map_physical{217.0}=0x0312 +phy_chain_tx_lane_map_physical{221.0}=0x2301 +phy_chain_tx_lane_map_physical{225.0}=0x0123 +phy_chain_tx_lane_map_physical{229.0}=0x2031 +phy_chain_tx_lane_map_physical{233.0}=0x0231 +phy_chain_tx_lane_map_physical{237.0}=0x0213 +phy_chain_tx_lane_map_physical{241.0}=0x1320 +phy_chain_tx_lane_map_physical{245.0}=0x2031 +phy_chain_tx_lane_map_physical{249.0}=0x3120 +phy_chain_tx_lane_map_physical{25.0}=0x0231 +phy_chain_tx_lane_map_physical{253.0}=0x0321 +phy_chain_tx_lane_map_physical{257.0}=0x3210 +phy_chain_tx_lane_map_physical{29.0}=0x1230 +phy_chain_tx_lane_map_physical{33.0}=0x1032 +phy_chain_tx_lane_map_physical{37.0}=0x0123 +phy_chain_tx_lane_map_physical{41.0}=0x0213 +phy_chain_tx_lane_map_physical{45.0}=0x0132 +phy_chain_tx_lane_map_physical{49.0}=0x2031 +phy_chain_tx_lane_map_physical{5.0}=0x2301 +phy_chain_tx_lane_map_physical{53.0}=0x2301 +phy_chain_tx_lane_map_physical{57.0}=0x2031 +phy_chain_tx_lane_map_physical{61.0}=0x2031 +phy_chain_tx_lane_map_physical{65.0}=0x1230 +phy_chain_tx_lane_map_physical{69.0}=0x2013 +phy_chain_tx_lane_map_physical{73.0}=0x0213 +phy_chain_tx_lane_map_physical{77.0}=0x2310 +phy_chain_tx_lane_map_physical{81.0}=0x0321 +phy_chain_tx_lane_map_physical{85.0}=0x2013 +phy_chain_tx_lane_map_physical{89.0}=0x0213 +phy_chain_tx_lane_map_physical{9.0}=0x3012 +phy_chain_tx_lane_map_physical{93.0}=0x3102 +phy_chain_tx_lane_map_physical{97.0}=0x3210 +phy_chain_tx_polarity_flip_physical{1.0}=0x0 +phy_chain_tx_polarity_flip_physical{10.0}=0x1 +phy_chain_tx_polarity_flip_physical{100.0}=0x0 +phy_chain_tx_polarity_flip_physical{101.0}=0x0 +phy_chain_tx_polarity_flip_physical{102.0}=0x1 +phy_chain_tx_polarity_flip_physical{103.0}=0x0 +phy_chain_tx_polarity_flip_physical{104.0}=0x0 +phy_chain_tx_polarity_flip_physical{105.0}=0x0 +phy_chain_tx_polarity_flip_physical{106.0}=0x1 +phy_chain_tx_polarity_flip_physical{107.0}=0x1 +phy_chain_tx_polarity_flip_physical{108.0}=0x1 +phy_chain_tx_polarity_flip_physical{109.0}=0x0 +phy_chain_tx_polarity_flip_physical{11.0}=0x1 +phy_chain_tx_polarity_flip_physical{110.0}=0x0 +phy_chain_tx_polarity_flip_physical{111.0}=0x0 +phy_chain_tx_polarity_flip_physical{112.0}=0x1 +phy_chain_tx_polarity_flip_physical{113.0}=0x1 +phy_chain_tx_polarity_flip_physical{114.0}=0x1 +phy_chain_tx_polarity_flip_physical{115.0}=0x1 +phy_chain_tx_polarity_flip_physical{116.0}=0x0 +phy_chain_tx_polarity_flip_physical{117.0}=0x1 +phy_chain_tx_polarity_flip_physical{118.0}=0x0 +phy_chain_tx_polarity_flip_physical{119.0}=0x0 +phy_chain_tx_polarity_flip_physical{12.0}=0x0 +phy_chain_tx_polarity_flip_physical{120.0}=0x0 +phy_chain_tx_polarity_flip_physical{121.0}=0x0 +phy_chain_tx_polarity_flip_physical{122.0}=0x0 +phy_chain_tx_polarity_flip_physical{123.0}=0x0 +phy_chain_tx_polarity_flip_physical{124.0}=0x1 +phy_chain_tx_polarity_flip_physical{125.0}=0x0 +phy_chain_tx_polarity_flip_physical{126.0}=0x1 +phy_chain_tx_polarity_flip_physical{127.0}=0x1 +phy_chain_tx_polarity_flip_physical{128.0}=0x1 +phy_chain_tx_polarity_flip_physical{129.0}=0x1 +phy_chain_tx_polarity_flip_physical{13.0}=0x0 +phy_chain_tx_polarity_flip_physical{130.0}=0x0 +phy_chain_tx_polarity_flip_physical{131.0}=0x1 +phy_chain_tx_polarity_flip_physical{132.0}=0x0 +phy_chain_tx_polarity_flip_physical{133.0}=0x1 +phy_chain_tx_polarity_flip_physical{134.0}=0x1 +phy_chain_tx_polarity_flip_physical{135.0}=0x1 +phy_chain_tx_polarity_flip_physical{136.0}=0x1 +phy_chain_tx_polarity_flip_physical{137.0}=0x1 +phy_chain_tx_polarity_flip_physical{138.0}=0x1 +phy_chain_tx_polarity_flip_physical{139.0}=0x1 +phy_chain_tx_polarity_flip_physical{14.0}=0x1 +phy_chain_tx_polarity_flip_physical{140.0}=0x1 +phy_chain_tx_polarity_flip_physical{141.0}=0x0 +phy_chain_tx_polarity_flip_physical{142.0}=0x1 +phy_chain_tx_polarity_flip_physical{143.0}=0x1 +phy_chain_tx_polarity_flip_physical{144.0}=0x1 +phy_chain_tx_polarity_flip_physical{145.0}=0x1 +phy_chain_tx_polarity_flip_physical{146.0}=0x1 +phy_chain_tx_polarity_flip_physical{147.0}=0x1 +phy_chain_tx_polarity_flip_physical{148.0}=0x0 +phy_chain_tx_polarity_flip_physical{149.0}=0x1 +phy_chain_tx_polarity_flip_physical{15.0}=0x0 +phy_chain_tx_polarity_flip_physical{150.0}=0x0 +phy_chain_tx_polarity_flip_physical{151.0}=0x0 +phy_chain_tx_polarity_flip_physical{152.0}=0x0 +phy_chain_tx_polarity_flip_physical{153.0}=0x1 +phy_chain_tx_polarity_flip_physical{154.0}=0x0 +phy_chain_tx_polarity_flip_physical{155.0}=0x0 +phy_chain_tx_polarity_flip_physical{156.0}=0x0 +phy_chain_tx_polarity_flip_physical{157.0}=0x0 +phy_chain_tx_polarity_flip_physical{158.0}=0x0 +phy_chain_tx_polarity_flip_physical{159.0}=0x0 +phy_chain_tx_polarity_flip_physical{16.0}=0x0 +phy_chain_tx_polarity_flip_physical{160.0}=0x0 +phy_chain_tx_polarity_flip_physical{161.0}=0x0 +phy_chain_tx_polarity_flip_physical{162.0}=0x1 +phy_chain_tx_polarity_flip_physical{163.0}=0x1 +phy_chain_tx_polarity_flip_physical{164.0}=0x0 +phy_chain_tx_polarity_flip_physical{165.0}=0x1 +phy_chain_tx_polarity_flip_physical{166.0}=0x1 +phy_chain_tx_polarity_flip_physical{167.0}=0x1 +phy_chain_tx_polarity_flip_physical{168.0}=0x0 +phy_chain_tx_polarity_flip_physical{169.0}=0x0 +phy_chain_tx_polarity_flip_physical{17.0}=0x0 +phy_chain_tx_polarity_flip_physical{170.0}=0x1 +phy_chain_tx_polarity_flip_physical{171.0}=0x1 +phy_chain_tx_polarity_flip_physical{172.0}=0x1 +phy_chain_tx_polarity_flip_physical{173.0}=0x0 +phy_chain_tx_polarity_flip_physical{174.0}=0x0 +phy_chain_tx_polarity_flip_physical{175.0}=0x1 +phy_chain_tx_polarity_flip_physical{176.0}=0x0 +phy_chain_tx_polarity_flip_physical{177.0}=0x1 +phy_chain_tx_polarity_flip_physical{178.0}=0x0 +phy_chain_tx_polarity_flip_physical{179.0}=0x0 +phy_chain_tx_polarity_flip_physical{18.0}=0x1 +phy_chain_tx_polarity_flip_physical{180.0}=0x0 +phy_chain_tx_polarity_flip_physical{181.0}=0x0 +phy_chain_tx_polarity_flip_physical{182.0}=0x0 +phy_chain_tx_polarity_flip_physical{183.0}=0x0 +phy_chain_tx_polarity_flip_physical{184.0}=0x1 +phy_chain_tx_polarity_flip_physical{185.0}=0x0 +phy_chain_tx_polarity_flip_physical{186.0}=0x1 +phy_chain_tx_polarity_flip_physical{187.0}=0x1 +phy_chain_tx_polarity_flip_physical{188.0}=0x1 +phy_chain_tx_polarity_flip_physical{189.0}=0x0 +phy_chain_tx_polarity_flip_physical{19.0}=0x1 +phy_chain_tx_polarity_flip_physical{190.0}=0x0 +phy_chain_tx_polarity_flip_physical{191.0}=0x0 +phy_chain_tx_polarity_flip_physical{192.0}=0x0 +phy_chain_tx_polarity_flip_physical{193.0}=0x1 +phy_chain_tx_polarity_flip_physical{194.0}=0x1 +phy_chain_tx_polarity_flip_physical{195.0}=0x1 +phy_chain_tx_polarity_flip_physical{196.0}=0x0 +phy_chain_tx_polarity_flip_physical{197.0}=0x0 +phy_chain_tx_polarity_flip_physical{198.0}=0x1 +phy_chain_tx_polarity_flip_physical{199.0}=0x1 +phy_chain_tx_polarity_flip_physical{2.0}=0x1 +phy_chain_tx_polarity_flip_physical{20.0}=0x1 +phy_chain_tx_polarity_flip_physical{200.0}=0x1 +phy_chain_tx_polarity_flip_physical{201.0}=0x1 +phy_chain_tx_polarity_flip_physical{202.0}=0x1 +phy_chain_tx_polarity_flip_physical{203.0}=0x1 +phy_chain_tx_polarity_flip_physical{204.0}=0x1 +phy_chain_tx_polarity_flip_physical{205.0}=0x0 +phy_chain_tx_polarity_flip_physical{206.0}=0x1 +phy_chain_tx_polarity_flip_physical{207.0}=0x1 +phy_chain_tx_polarity_flip_physical{208.0}=0x1 +phy_chain_tx_polarity_flip_physical{209.0}=0x1 +phy_chain_tx_polarity_flip_physical{21.0}=0x0 +phy_chain_tx_polarity_flip_physical{210.0}=0x1 +phy_chain_tx_polarity_flip_physical{211.0}=0x1 +phy_chain_tx_polarity_flip_physical{212.0}=0x0 +phy_chain_tx_polarity_flip_physical{213.0}=0x0 +phy_chain_tx_polarity_flip_physical{214.0}=0x1 +phy_chain_tx_polarity_flip_physical{215.0}=0x0 +phy_chain_tx_polarity_flip_physical{216.0}=0x1 +phy_chain_tx_polarity_flip_physical{217.0}=0x1 +phy_chain_tx_polarity_flip_physical{218.0}=0x1 +phy_chain_tx_polarity_flip_physical{219.0}=0x0 +phy_chain_tx_polarity_flip_physical{22.0}=0x0 +phy_chain_tx_polarity_flip_physical{220.0}=0x1 +phy_chain_tx_polarity_flip_physical{221.0}=0x0 +phy_chain_tx_polarity_flip_physical{222.0}=0x0 +phy_chain_tx_polarity_flip_physical{223.0}=0x0 +phy_chain_tx_polarity_flip_physical{224.0}=0x1 +phy_chain_tx_polarity_flip_physical{225.0}=0x1 +phy_chain_tx_polarity_flip_physical{226.0}=0x1 +phy_chain_tx_polarity_flip_physical{227.0}=0x1 +phy_chain_tx_polarity_flip_physical{228.0}=0x0 +phy_chain_tx_polarity_flip_physical{229.0}=0x0 +phy_chain_tx_polarity_flip_physical{23.0}=0x0 +phy_chain_tx_polarity_flip_physical{230.0}=0x1 +phy_chain_tx_polarity_flip_physical{231.0}=0x1 +phy_chain_tx_polarity_flip_physical{232.0}=0x1 +phy_chain_tx_polarity_flip_physical{233.0}=0x0 +phy_chain_tx_polarity_flip_physical{234.0}=0x0 +phy_chain_tx_polarity_flip_physical{235.0}=0x0 +phy_chain_tx_polarity_flip_physical{236.0}=0x0 +phy_chain_tx_polarity_flip_physical{237.0}=0x1 +phy_chain_tx_polarity_flip_physical{238.0}=0x1 +phy_chain_tx_polarity_flip_physical{239.0}=0x1 +phy_chain_tx_polarity_flip_physical{24.0}=0x0 +phy_chain_tx_polarity_flip_physical{240.0}=0x0 +phy_chain_tx_polarity_flip_physical{241.0}=0x1 +phy_chain_tx_polarity_flip_physical{242.0}=0x1 +phy_chain_tx_polarity_flip_physical{243.0}=0x1 +phy_chain_tx_polarity_flip_physical{244.0}=0x0 +phy_chain_tx_polarity_flip_physical{245.0}=0x1 +phy_chain_tx_polarity_flip_physical{246.0}=0x1 +phy_chain_tx_polarity_flip_physical{247.0}=0x1 +phy_chain_tx_polarity_flip_physical{248.0}=0x1 +phy_chain_tx_polarity_flip_physical{249.0}=0x1 +phy_chain_tx_polarity_flip_physical{25.0}=0x1 +phy_chain_tx_polarity_flip_physical{250.0}=0x0 +phy_chain_tx_polarity_flip_physical{251.0}=0x0 +phy_chain_tx_polarity_flip_physical{252.0}=0x0 +phy_chain_tx_polarity_flip_physical{253.0}=0x1 +phy_chain_tx_polarity_flip_physical{254.0}=0x1 +phy_chain_tx_polarity_flip_physical{255.0}=0x1 +phy_chain_tx_polarity_flip_physical{256.0}=0x0 +phy_chain_tx_polarity_flip_physical{257.0}=0x0 +phy_chain_tx_polarity_flip_physical{259.0}=0x0 +phy_chain_tx_polarity_flip_physical{26.0}=0x0 +phy_chain_tx_polarity_flip_physical{27.0}=0x0 +phy_chain_tx_polarity_flip_physical{28.0}=0x0 +phy_chain_tx_polarity_flip_physical{29.0}=0x1 +phy_chain_tx_polarity_flip_physical{3.0}=0x1 +phy_chain_tx_polarity_flip_physical{30.0}=0x1 +phy_chain_tx_polarity_flip_physical{31.0}=0x1 +phy_chain_tx_polarity_flip_physical{32.0}=0x0 +phy_chain_tx_polarity_flip_physical{33.0}=0x0 +phy_chain_tx_polarity_flip_physical{34.0}=0x0 +phy_chain_tx_polarity_flip_physical{35.0}=0x0 +phy_chain_tx_polarity_flip_physical{36.0}=0x1 +phy_chain_tx_polarity_flip_physical{37.0}=0x1 +phy_chain_tx_polarity_flip_physical{38.0}=0x1 +phy_chain_tx_polarity_flip_physical{39.0}=0x1 +phy_chain_tx_polarity_flip_physical{4.0}=0x1 +phy_chain_tx_polarity_flip_physical{40.0}=0x0 +phy_chain_tx_polarity_flip_physical{41.0}=0x0 +phy_chain_tx_polarity_flip_physical{42.0}=0x0 +phy_chain_tx_polarity_flip_physical{43.0}=0x0 +phy_chain_tx_polarity_flip_physical{44.0}=0x0 +phy_chain_tx_polarity_flip_physical{45.0}=0x1 +phy_chain_tx_polarity_flip_physical{46.0}=0x0 +phy_chain_tx_polarity_flip_physical{47.0}=0x1 +phy_chain_tx_polarity_flip_physical{48.0}=0x1 +phy_chain_tx_polarity_flip_physical{49.0}=0x0 +phy_chain_tx_polarity_flip_physical{5.0}=0x1 +phy_chain_tx_polarity_flip_physical{50.0}=0x0 +phy_chain_tx_polarity_flip_physical{51.0}=0x0 +phy_chain_tx_polarity_flip_physical{52.0}=0x1 +phy_chain_tx_polarity_flip_physical{53.0}=0x0 +phy_chain_tx_polarity_flip_physical{54.0}=0x1 +phy_chain_tx_polarity_flip_physical{55.0}=0x1 +phy_chain_tx_polarity_flip_physical{56.0}=0x0 +phy_chain_tx_polarity_flip_physical{57.0}=0x0 +phy_chain_tx_polarity_flip_physical{58.0}=0x1 +phy_chain_tx_polarity_flip_physical{59.0}=0x1 +phy_chain_tx_polarity_flip_physical{6.0}=0x1 +phy_chain_tx_polarity_flip_physical{60.0}=0x1 +phy_chain_tx_polarity_flip_physical{61.0}=0x0 +phy_chain_tx_polarity_flip_physical{62.0}=0x1 +phy_chain_tx_polarity_flip_physical{63.0}=0x1 +phy_chain_tx_polarity_flip_physical{64.0}=0x1 +phy_chain_tx_polarity_flip_physical{65.0}=0x0 +phy_chain_tx_polarity_flip_physical{66.0}=0x1 +phy_chain_tx_polarity_flip_physical{67.0}=0x1 +phy_chain_tx_polarity_flip_physical{68.0}=0x0 +phy_chain_tx_polarity_flip_physical{69.0}=0x1 +phy_chain_tx_polarity_flip_physical{7.0}=0x1 +phy_chain_tx_polarity_flip_physical{70.0}=0x1 +phy_chain_tx_polarity_flip_physical{71.0}=0x1 +phy_chain_tx_polarity_flip_physical{72.0}=0x0 +phy_chain_tx_polarity_flip_physical{73.0}=0x1 +phy_chain_tx_polarity_flip_physical{74.0}=0x0 +phy_chain_tx_polarity_flip_physical{75.0}=0x0 +phy_chain_tx_polarity_flip_physical{76.0}=0x0 +phy_chain_tx_polarity_flip_physical{77.0}=0x0 +phy_chain_tx_polarity_flip_physical{78.0}=0x0 +phy_chain_tx_polarity_flip_physical{79.0}=0x1 +phy_chain_tx_polarity_flip_physical{8.0}=0x0 +phy_chain_tx_polarity_flip_physical{80.0}=0x0 +phy_chain_tx_polarity_flip_physical{81.0}=0x1 +phy_chain_tx_polarity_flip_physical{82.0}=0x1 +phy_chain_tx_polarity_flip_physical{83.0}=0x1 +phy_chain_tx_polarity_flip_physical{84.0}=0x0 +phy_chain_tx_polarity_flip_physical{85.0}=0x1 +phy_chain_tx_polarity_flip_physical{86.0}=0x0 +phy_chain_tx_polarity_flip_physical{87.0}=0x0 +phy_chain_tx_polarity_flip_physical{88.0}=0x0 +phy_chain_tx_polarity_flip_physical{89.0}=0x1 +phy_chain_tx_polarity_flip_physical{9.0}=0x0 +phy_chain_tx_polarity_flip_physical{90.0}=0x1 +phy_chain_tx_polarity_flip_physical{91.0}=0x1 +phy_chain_tx_polarity_flip_physical{92.0}=0x0 +phy_chain_tx_polarity_flip_physical{93.0}=0x0 +phy_chain_tx_polarity_flip_physical{94.0}=0x0 +phy_chain_tx_polarity_flip_physical{95.0}=0x0 +phy_chain_tx_polarity_flip_physical{96.0}=0x0 +phy_chain_tx_polarity_flip_physical{97.0}=0x0 +phy_chain_tx_polarity_flip_physical{98.0}=0x1 +phy_chain_tx_polarity_flip_physical{99.0}=0x1 + +port_init_cl72_hg=1 + + + + + + + +robust_hash_disable_egress_vlan=1 +robust_hash_disable_mpls=1 +robust_hash_disable_vlan=1 +stable_size=0x5500000 +stable_size=0x5500000 +tdma_timeout_usec=15000000 +tslam_timeout_usec=15000000 +dport_map_direct=1 +portmap_1=5:50 +portmap_2=7:50 +portmap_3=13:50 +portmap_4=15:50 +portmap_5=25:50 +portmap_6=27:50 +portmap_7=21:50 +portmap_8=23:50 +portmap_9=37:50 +portmap_10=39:50 +portmap_11=45:50 +portmap_12=47:50 +portmap_13=57:100 +portmap_14=53:100 +portmap_15=9:50 +portmap_16=11:50 +portmap_17=1:50 +portmap_18=3:50 +portmap_19=17:50 +portmap_20=19:50 +portmap_21=29:50 +portmap_22=31:50 +portmap_23=41:50 +portmap_24=43:50 +portmap_25=33:50 +portmap_26=35:50 +portmap_27=49:100 +portmap_28=61:100 +portmap_34=77:50 +portmap_35=79:50 +portmap_36=65:50 +portmap_37=67:50 +portmap_38=85:50 +portmap_39=87:50 +portmap_40=89:50 +portmap_41=91:50 +portmap_42=109:50 +portmap_43=111:50 +portmap_44=97:50 +portmap_45=99:50 +portmap_46=117:100 +portmap_47=121:100 +portmap_48=69:50 +portmap_49=71:50 +portmap_50=73:50 +portmap_51=75:50 +portmap_52=93:50 +portmap_53=95:50 +portmap_54=81:50 +portmap_55=83:50 +portmap_56=101:50 +portmap_57=103:50 +portmap_58=105:50 +portmap_59=107:50 +portmap_60=125:100 +portmap_61=113:100 +portmap_66=257:10 +portmap_68=141:100 +portmap_69=133:100 +portmap_70=149:50 +portmap_71=151:50 +portmap_72=153:50 +portmap_73=155:50 +portmap_74=173:50 +portmap_75=175:50 +portmap_76=161:50 +portmap_77=163:50 +portmap_78=181:50 +portmap_79=183:50 +portmap_80=185:50 +portmap_81=187:50 +portmap_82=129:100 +portmap_83=137:100 +portmap_84=157:50 +portmap_85=159:50 +portmap_86=145:50 +portmap_87=147:50 +portmap_88=165:50 +portmap_89=167:50 +portmap_90=169:50 +portmap_91=171:50 +portmap_92=189:50 +portmap_93=191:50 +portmap_94=177:50 +portmap_95=179:50 +portmap_100=259:10 +portmap_102=197:100 +portmap_103=205:100 +portmap_104=217:50 +portmap_105=219:50 +portmap_106=213:50 +portmap_107=215:50 +portmap_108=229:50 +portmap_109=231:50 +portmap_110=237:50 +portmap_111=239:50 +portmap_112=249:50 +portmap_113=251:50 +portmap_114=245:50 +portmap_115=247:50 +portmap_116=201:100 +portmap_117=193:100 +portmap_118=209:50 +portmap_119=211:50 +portmap_120=221:50 +portmap_121=223:50 +portmap_122=233:50 +portmap_123=235:50 +portmap_124=225:50 +portmap_125=227:50 +portmap_126=241:50 +portmap_127=243:50 +portmap_128=253:50 +portmap_129=255:50 + +# tuning parameters +serdes_preemphasis_1=0x580c +serdes_preemphasis_2=0x580c +serdes_preemphasis_3=0x580c +serdes_preemphasis_4=0x580c +serdes_preemphasis_5=0x580c +serdes_preemphasis_6=0x580c +serdes_preemphasis_7=0x580c +serdes_preemphasis_8=0x580c +serdes_preemphasis_9=0x580c +serdes_preemphasis_10=0x580c +serdes_preemphasis_11=0x580c +serdes_preemphasis_12=0x580c +serdes_preemphasis_13=0x83404 +serdes_preemphasis_14=0x83404 +serdes_preemphasis_15=0x580c +serdes_preemphasis_16=0x580c +serdes_preemphasis_17=0x580c +serdes_preemphasis_18=0x580c +serdes_preemphasis_19=0x580c +serdes_preemphasis_20=0x580c +serdes_preemphasis_21=0x580c +serdes_preemphasis_22=0x580c +serdes_preemphasis_23=0x580c +serdes_preemphasis_24=0x580c +serdes_preemphasis_25=0x580c +serdes_preemphasis_26=0x580c +serdes_preemphasis_27=0xf3c05 +serdes_preemphasis_28=0xf3d05 +serdes_preemphasis_34=0x580c +serdes_preemphasis_35=0x580c +serdes_preemphasis_36=0x580c +serdes_preemphasis_37=0x580c +serdes_preemphasis_38=0x580c +serdes_preemphasis_39=0x580c +serdes_preemphasis_40=0x580c +serdes_preemphasis_41=0x580c +serdes_preemphasis_42=0x580c +serdes_preemphasis_43=0x580c +serdes_preemphasis_44=0x580c +serdes_preemphasis_45=0x580c +serdes_preemphasis_46=0xb3604 +serdes_preemphasis_47=0x72b03 +serdes_preemphasis_48=0x580c +serdes_preemphasis_49=0x580c +serdes_preemphasis_50=0x580c +serdes_preemphasis_51=0x580c +serdes_preemphasis_52=0x580c +serdes_preemphasis_53=0x580c +serdes_preemphasis_54=0x580c +serdes_preemphasis_55=0x580c +serdes_preemphasis_56=0x580c +serdes_preemphasis_57=0x580c +serdes_preemphasis_58=0x580c +serdes_preemphasis_59=0x580c +serdes_preemphasis_60=0xf3c05 +serdes_preemphasis_61=0x103f06 +serdes_preemphasis_66=0x43004 +serdes_preemphasis_68=0xf4006 +serdes_preemphasis_69=0xf4006 +serdes_preemphasis_70=0x580c +serdes_preemphasis_71=0x580c +serdes_preemphasis_72=0x580c +serdes_preemphasis_73=0x580c +serdes_preemphasis_74=0x580c +serdes_preemphasis_75=0x580c +serdes_preemphasis_76=0x580c +serdes_preemphasis_77=0x580c +serdes_preemphasis_78=0x580c +serdes_preemphasis_79=0x580c +serdes_preemphasis_80=0x580c +serdes_preemphasis_81=0x580c +serdes_preemphasis_82=0x73103 +serdes_preemphasis_83=0x73103 +serdes_preemphasis_84=0x580c +serdes_preemphasis_85=0x580c +serdes_preemphasis_86=0x580c +serdes_preemphasis_87=0x580c +serdes_preemphasis_88=0x580c +serdes_preemphasis_89=0x580c +serdes_preemphasis_90=0x580c +serdes_preemphasis_91=0x580c +serdes_preemphasis_92=0x580c +serdes_preemphasis_93=0x580c +serdes_preemphasis_94=0x580c +serdes_preemphasis_95=0x580c +serdes_preemphasis_100=0x43004 +serdes_preemphasis_102=0xf3c05 +serdes_preemphasis_103=0xf3c05 +serdes_preemphasis_104=0x580c +serdes_preemphasis_105=0x580c +serdes_preemphasis_106=0x580c +serdes_preemphasis_107=0x580c +serdes_preemphasis_108=0x580c +serdes_preemphasis_109=0x580c +serdes_preemphasis_110=0x580c +serdes_preemphasis_111=0x580c +serdes_preemphasis_112=0x580c +serdes_preemphasis_113=0x580c +serdes_preemphasis_114=0x580c +serdes_preemphasis_115=0x580c +serdes_preemphasis_116=0x83404 +serdes_preemphasis_117=0x83404 +serdes_preemphasis_118=0x580c +serdes_preemphasis_119=0x580c +serdes_preemphasis_120=0x580c +serdes_preemphasis_121=0x580c +serdes_preemphasis_122=0x580c +serdes_preemphasis_123=0x580c +serdes_preemphasis_124=0x580c +serdes_preemphasis_125=0x580c +serdes_preemphasis_126=0x580c +serdes_preemphasis_127=0x580c +serdes_preemphasis_128=0x580c +serdes_preemphasis_129=0x580c + +mmu_init_config="MSFT-TH2-Tier0" diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/BALANCED b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/BALANCED new file mode 120000 index 00000000000..a270c70ffc3 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/BALANCED \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/RDMA-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/RDMA-CENTRIC new file mode 120000 index 00000000000..8d1ec6d277a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/RDMA-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/TCP-CENTRIC b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/TCP-CENTRIC new file mode 120000 index 00000000000..7ee783aac6a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th2/7260/TCP-CENTRIC \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t0.j2 new file mode 100644 index 00000000000..2d56c4b38f9 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 deleted file mode 100644 index 3442612f70b..00000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 +++ /dev/null @@ -1,46 +0,0 @@ -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "33329088", - "type": "ingress", - "mode": "dynamic", - "xoff": "7827456" - }, - "egress_lossy_pool": { - "size": "26663272", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "42349632", - "type": "egress", - "mode": "static" - } - }, - "BUFFER_PROFILE": { - "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "size":"0", - "static_th":"44302336" - }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossless_pool]", - "size":"0", - "static_th":"42349632" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1664", - "dynamic_th":"-1" - } - }, -{%- endmacro %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini deleted file mode 100644 index ac33b4f961f..00000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini +++ /dev/null @@ -1,11 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 40000 5m 1248 1248 56160 -3 2496 - 50000 5m 1248 1248 56160 -3 2496 - 100000 5m 1248 1248 96928 -3 2496 - 40000 40m 1248 1248 71552 -3 2496 - 50000 40m 1248 1248 96096 -3 2496 - 100000 40m 1248 1248 177632 -3 2496 - 40000 300m 1248 1248 108160 -3 2496 - 50000 300m 1248 1248 141856 -3 2496 - 100000 300m 1248 1248 268736 -3 2496 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 deleted file mode 100644 index 3e548325ea3..00000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 +++ /dev/null @@ -1 +0,0 @@ -{%- include 'qos_config.j2' %} diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/sai.profile index db64a26b47d..a89cba46c3d 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/sai.profile +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-a7260cx3-64-64x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm index f5ac5e37ef7..e26a8131efd 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm @@ -1,7 +1,7 @@ PHY_AN_ALLOW_PLL_CHANGE=1 arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/arista/x86_64-arista_7260cx3_64/pmon_daemon_control.json b/device/arista/x86_64-arista_7260cx3_64/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7260cx3_64/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7260cx3_64/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7260cx3_64/thermal_policy.json b/device/arista/x86_64-arista_7260cx3_64/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C28S8/sai.profile b/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C28S8/sai.profile index 7e699b10430..f0554cdb874 100644 --- a/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C28S8/sai.profile +++ b/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C28S8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/jr2-a7280cr3-32p4-28x100G-8x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C40/sai.profile b/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C40/sai.profile index 130a3f8c4cb..ac1394486c6 100644 --- a/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C40/sai.profile +++ b/device/arista/x86_64-arista_7280cr3_32p4/Arista-7280CR3-C40/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/jr2-a7280cr3-32p4-40x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/arista/x86_64-arista_7280cr3_32p4/fancontrol b/device/arista/x86_64-arista_7280cr3_32p4/fancontrol index 1c0415b7e46..55a48e09508 100644 --- a/device/arista/x86_64-arista_7280cr3_32p4/fancontrol +++ b/device/arista/x86_64-arista_7280cr3_32p4/fancontrol @@ -1,7 +1,7 @@ INTERVAL=5 -DEVPATH=hwmon2=devices/pci0000:00/0000:00:09.0 hwmon4=devices/pci0000:00/0000:00:09.0/i2c-56/56-004c -DEVNAME=hwmon2=scd_fan_p3 hwmon4=max6658 -FCTEMPS=hwmon2/pwm6=hwmon4/temp1_input hwmon2/pwm5=hwmon4/temp1_input hwmon2/pwm4=hwmon4/temp1_input hwmon2/pwm4=hwmon4/temp1_input hwmon2/pwm2=hwmon4/temp1_input hwmon2/pwm1=hwmon4/temp1_input +DEVPATH=hwmon2=devices/pci0000:00/0000:00:09.0 hwmon3=devices/pci0000:00/0000:00:09.0/i2c-56/56-004c +DEVNAME=hwmon2=scd_fan_p3 hwmon3=max6658 +FCTEMPS=hwmon2/pwm6=hwmon3/temp1_input hwmon2/pwm5=hwmon3/temp1_input hwmon2/pwm4=hwmon3/temp1_input hwmon2/pwm3=hwmon3/temp1_input hwmon2/pwm2=hwmon3/temp1_input hwmon2/pwm1=hwmon3/temp1_input FCFANS=hwmon2/pwm6=hwmon2/fan6_input hwmon2/pwm5=hwmon2/fan5_input hwmon2/pwm4=hwmon2/fan4_input hwmon2/pwm3=hwmon2/fan3_input hwmon2/pwm2=hwmon2/fan2_input hwmon2/pwm1=hwmon2/fan1_input MINTEMP=hwmon2/pwm6=50 hwmon2/pwm5=50 hwmon2/pwm4=50 hwmon2/pwm3=50 hwmon2/pwm2=50 hwmon2/pwm1=50 MINPWM=hwmon2/pwm6=128 hwmon2/pwm5=128 hwmon2/pwm4=128 hwmon2/pwm3=128 hwmon2/pwm2=128 hwmon2/pwm1=128 diff --git a/device/arista/x86_64-arista_7280cr3_32p4/pmon_daemon_control.json b/device/arista/x86_64-arista_7280cr3_32p4/pmon_daemon_control.json index 2322ef7a22d..51d5ab7b005 120000 --- a/device/arista/x86_64-arista_7280cr3_32p4/pmon_daemon_control.json +++ b/device/arista/x86_64-arista_7280cr3_32p4/pmon_daemon_control.json @@ -1 +1 @@ -../x86_64-arista_common/pmon_daemon_control_skip_thermalctld.json \ No newline at end of file +../x86_64-arista_common/pmon_daemon_control.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_7280cr3_32p4/thermal_policy.json b/device/arista/x86_64-arista_7280cr3_32p4/thermal_policy.json new file mode 120000 index 00000000000..0991dc7f363 --- /dev/null +++ b/device/arista/x86_64-arista_7280cr3_32p4/thermal_policy.json @@ -0,0 +1 @@ +../x86_64-arista_common/thermal_policy.json \ No newline at end of file diff --git a/device/arista/x86_64-arista_common/pmon_daemon_control.json b/device/arista/x86_64-arista_common/pmon_daemon_control.json new file mode 100644 index 00000000000..6453cd2c5d0 --- /dev/null +++ b/device/arista/x86_64-arista_common/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_fancontrol": true +} + diff --git a/device/arista/x86_64-arista_common/thermal_policy.json b/device/arista/x86_64-arista_common/thermal_policy.json new file mode 100644 index 00000000000..ca1f01e7be5 --- /dev/null +++ b/device/arista/x86_64-arista_common/thermal_policy.json @@ -0,0 +1,60 @@ +{ + "thermal_control_algorithm": { + "run_at_boot_up": "true", + "fan_speed_when_suspend": "100" + }, + "info_types": [ + { + "type": "control_info" + }, + { + "type": "fan_info" + }, + { + "type": "thermal_info" + } + ], + "policies": [ + { + "name": "any thermal critical", + "conditions": [ + { + "type": "thermal.any.critical" + } + ], + "actions": [ + { + "type": "fan.all.set_speed", + "speed": "100" + } + ] + }, + { + "name": "any thermal overheat", + "conditions": [ + { + "type": "thermal.any.overheat" + } + ], + "actions": [ + { + "type": "fan.all.set_speed", + "speed": "100" + } + ] + }, + { + "name": "normal operations", + "conditions": [ + { + "type": "normal" + } + ], + "actions": [ + { + "type": "thermal_control.control" + } + ] + } + ] +} diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/default_sku b/device/barefoot/x86_64-accton_as9516_32d-r0/default_sku similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/default_sku rename to device/barefoot/x86_64-accton_as9516_32d-r0/default_sku diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/installer.conf b/device/barefoot/x86_64-accton_as9516_32d-r0/installer.conf similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/installer.conf rename to device/barefoot/x86_64-accton_as9516_32d-r0/installer.conf diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/buffers.json.j2 b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers.json.j2 similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/buffers.json.j2 rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers.json.j2 diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/buffers_defaults_t0.j2 b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t0.j2 similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/buffers_defaults_t0.j2 rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t0.j2 diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/buffers_defaults_t1.j2 b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t1.j2 similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/buffers_defaults_t1.j2 rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/buffers_defaults_t1.j2 diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/pg_profile_lookup.ini b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/pg_profile_lookup.ini similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/pg_profile_lookup.ini rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/pg_profile_lookup.ini diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/port_config.ini b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/port_config.ini similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/port_config.ini rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/port_config.ini diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/qos.json.j2 b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/qos.json.j2 similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/qos.json.j2 rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/qos.json.j2 diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/sai.profile b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/sai.profile similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/sai.profile rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/sai.profile diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/switch-tna-sai.conf b/device/barefoot/x86_64-accton_as9516_32d-r0/newport/switch-tna-sai.conf similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/newport/switch-tna-sai.conf rename to device/barefoot/x86_64-accton_as9516_32d-r0/newport/switch-tna-sai.conf diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/plugins b/device/barefoot/x86_64-accton_as9516_32d-r0/plugins similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/plugins rename to device/barefoot/x86_64-accton_as9516_32d-r0/plugins diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0/pmon_daemon_control.json b/device/barefoot/x86_64-accton_as9516_32d-r0/pmon_daemon_control.json similarity index 100% rename from device/barefoot/x86_64-accton_as9516bf_32d-r0/pmon_daemon_control.json rename to device/barefoot/x86_64-accton_as9516_32d-r0/pmon_daemon_control.json diff --git a/device/barefoot/x86_64-accton_as9516_32d-r0/syncd.conf b/device/barefoot/x86_64-accton_as9516_32d-r0/syncd.conf new file mode 100644 index 00000000000..11956f83a5a --- /dev/null +++ b/device/barefoot/x86_64-accton_as9516_32d-r0/syncd.conf @@ -0,0 +1,29 @@ +#!/bin/bash + + +y_profile_set() { + P4_PROFILE=$(sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["p4_profile"]') + if [[ -n "$P4_PROFILE" || ( ! -L /opt/bfn/install && -e /opt/bfn/install ) ]]; then + return + fi + + if [[ $(readlink /opt/bfn/install) =~ "install_y" ]]; then + echo "/opt/bfn/install is a link to Y profile" + return + fi + + Y_PROFILE=$(ls -d /opt/bfn/install_y*_profile 2> /dev/null | head -1) + if [[ -z $Y_PROFILE ]]; then + echo "No P4 profile found for Newport" + return + fi + + echo "Link /opt/bfn/install to $Y_PROFILE" + ln -srfn $Y_PROFILE /opt/bfn/install +} + +( + unset PYTHONPATH + unset PYTHONHOME + y_profile_set +) diff --git a/device/barefoot/x86_64-accton_as9516bf_32d-r0 b/device/barefoot/x86_64-accton_as9516bf_32d-r0 new file mode 120000 index 00000000000..93f47d51b74 --- /dev/null +++ b/device/barefoot/x86_64-accton_as9516bf_32d-r0 @@ -0,0 +1 @@ +x86_64-accton_as9516_32d-r0 \ No newline at end of file diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py index 9c14441475d..937cc003f60 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py @@ -77,12 +77,12 @@ EEPROM_STATUS = "/var/run/platform/eeprom/status" class board(eeprom_tlvinfo.TlvInfoDecoder): - RETRIES = 3 + RETRIES = 35 def __init__(self, name, path, cpld_root, ro): with open(os.path.dirname(__file__) + "/logging.conf", 'r') as f: - config_dict = yaml.load(f) + config_dict = yaml.load(f, yaml.SafeLoader) logging.config.dictConfig(config_dict) if not os.path.exists(os.path.dirname(EEPROM_SYMLINK)): @@ -101,8 +101,10 @@ def __init__(self, name, path, cpld_root, ro): super(board, self).__init__(self.eeprom_path, 0, EEPROM_STATUS, True) for attempt in range(self.RETRIES): - if self.eeprom_init() or (attempt + 1 >= self.RETRIES): + if self.eeprom_init(): break + if attempt + 1 == self.RETRIES: + raise RuntimeError("eeprom.py: Initialization failed") time.sleep(1) def thrift_setup(self): diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py index 1daee453573..f6cb5666af3 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py @@ -146,7 +146,7 @@ def reset(self, port_num): status = pltfm_mgr.pltfm_mgr_qsfp_reset(port_num, True) status = pltfm_mgr.pltfm_mgr_qsfp_reset(port_num, False) self.thrift_teardown() - return status + return (status == 0) def check_transceiver_change(self): if not self.ready: diff --git a/device/broadcom/x86_64-bcm_xlr-r0/BCM956960K/sai.profile b/device/broadcom/x86_64-bcm_xlr-r0/BCM956960K/sai.profile index e80e0d4c89b..9e6a31e3d1e 100644 --- a/device/broadcom/x86_64-bcm_xlr-r0/BCM956960K/sai.profile +++ b/device/broadcom/x86_64-bcm_xlr-r0/BCM956960K/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th_32x100.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/default_sku b/device/cameo/x86_64-cameo_esc600_128q-r0/default_sku new file mode 100644 index 00000000000..bbf6939681e --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/default_sku @@ -0,0 +1 @@ +esc600-128q t1 diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers.json.j2 b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers.json.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/config_128x100G_Cameo-esc600-128q.yaml b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/config_128x100G_Cameo-esc600-128q.yaml new file mode 100644 index 00000000000..0664c2172c8 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/config_128x100G_Cameo-esc600-128q.yaml @@ -0,0 +1,1249 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + wred_cr_ip_proto_list: "17" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + mac_clk: "1340" + sys_clk: "1720" + ifc_clk: "1200" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "57" + lanes: "0:2" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "59" + lanes: "2:2" + serdes_group: "7" + speed: "100G" + sysport: "59" + type: "eth" + - fec: "KPFEC" + id: "61" + lanes: "4:2" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + - fec: "KPFEC" + id: "63" + lanes: "6:2" + serdes_group: "7" + speed: "100G" + sysport: "63" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:2" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "51" + lanes: "2:2" + serdes_group: "6" + speed: "100G" + sysport: "51" + type: "eth" + - fec: "KPFEC" + id: "53" + lanes: "4:2" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + - fec: "KPFEC" + id: "55" + lanes: "6:2" + serdes_group: "6" + speed: "100G" + sysport: "55" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:2" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "43" + lanes: "2:2" + serdes_group: "5" + speed: "100G" + sysport: "43" + type: "eth" + - fec: "KPFEC" + id: "45" + lanes: "4:2" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + - fec: "KPFEC" + id: "47" + lanes: "6:2" + serdes_group: "5" + speed: "100G" + sysport: "47" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:2" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "35" + lanes: "2:2" + serdes_group: "4" + speed: "100G" + sysport: "35" + type: "eth" + - fec: "KPFEC" + id: "37" + lanes: "4:2" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KPFEC" + id: "39" + lanes: "6:2" + serdes_group: "4" + speed: "100G" + sysport: "39" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:2" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "27" + lanes: "2:2" + serdes_group: "3" + speed: "100G" + sysport: "27" + type: "eth" + - fec: "KPFEC" + id: "29" + lanes: "4:2" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KPFEC" + id: "31" + lanes: "6:2" + serdes_group: "3" + speed: "100G" + sysport: "31" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:2" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "19" + lanes: "2:2" + serdes_group: "2" + speed: "100G" + sysport: "19" + type: "eth" + - fec: "KPFEC" + id: "21" + lanes: "4:2" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KPFEC" + id: "23" + lanes: "6:2" + serdes_group: "2" + speed: "100G" + sysport: "23" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:2" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "11" + lanes: "2:2" + serdes_group: "1" + speed: "100G" + sysport: "11" + type: "eth" + - fec: "KPFEC" + id: "13" + lanes: "4:2" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - fec: "KPFEC" + id: "15" + lanes: "6:2" + serdes_group: "1" + speed: "100G" + sysport: "15" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:2" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "3" + lanes: "2:2" + serdes_group: "0" + speed: "100G" + sysport: "3" + type: "eth" + - fec: "KPFEC" + id: "5" + lanes: "4:2" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" + - fec: "KPFEC" + id: "7" + lanes: "6:2" + serdes_group: "0" + speed: "100G" + sysport: "7" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:2" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "251" + lanes: "2:2" + serdes_group: "31" + speed: "100G" + sysport: "251" + type: "eth" + - fec: "KPFEC" + id: "253" + lanes: "4:2" + serdes_group: "31" + speed: "100G" + sysport: "253" + type: "eth" + - fec: "KPFEC" + id: "255" + lanes: "6:2" + serdes_group: "31" + speed: "100G" + sysport: "255" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:2" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "243" + lanes: "2:2" + serdes_group: "30" + speed: "100G" + sysport: "243" + type: "eth" + - fec: "KPFEC" + id: "245" + lanes: "4:2" + serdes_group: "30" + speed: "100G" + sysport: "245" + type: "eth" + - fec: "KPFEC" + id: "247" + lanes: "6:2" + serdes_group: "30" + speed: "100G" + sysport: "247" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:2" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "235" + lanes: "2:2" + serdes_group: "29" + speed: "100G" + sysport: "235" + type: "eth" + - fec: "KPFEC" + id: "237" + lanes: "4:2" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + - fec: "KPFEC" + id: "239" + lanes: "6:2" + serdes_group: "29" + speed: "100G" + sysport: "239" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:2" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "227" + lanes: "2:2" + serdes_group: "28" + speed: "100G" + sysport: "227" + type: "eth" + - fec: "KPFEC" + id: "229" + lanes: "4:2" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + - fec: "KPFEC" + id: "231" + lanes: "6:2" + serdes_group: "28" + speed: "100G" + sysport: "231" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:2" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "219" + lanes: "2:2" + serdes_group: "27" + speed: "100G" + sysport: "219" + type: "eth" + - fec: "KPFEC" + id: "221" + lanes: "4:2" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + - fec: "KPFEC" + id: "223" + lanes: "6:2" + serdes_group: "27" + speed: "100G" + sysport: "223" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:2" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "211" + lanes: "2:2" + serdes_group: "26" + speed: "100G" + sysport: "211" + type: "eth" + - fec: "KPFEC" + id: "213" + lanes: "4:2" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + - fec: "KPFEC" + id: "215" + lanes: "6:2" + serdes_group: "26" + speed: "100G" + sysport: "215" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:2" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "203" + lanes: "2:2" + serdes_group: "25" + speed: "100G" + sysport: "203" + type: "eth" + - fec: "KPFEC" + id: "205" + lanes: "4:2" + serdes_group: "25" + speed: "100G" + sysport: "205" + type: "eth" + - fec: "KPFEC" + id: "207" + lanes: "6:2" + serdes_group: "25" + speed: "100G" + sysport: "207" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:2" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "195" + lanes: "2:2" + serdes_group: "24" + speed: "100G" + sysport: "195" + type: "eth" + - fec: "KPFEC" + id: "197" + lanes: "4:2" + serdes_group: "24" + speed: "100G" + sysport: "197" + type: "eth" + - fec: "KPFEC" + id: "199" + lanes: "6:2" + serdes_group: "24" + speed: "100G" + sysport: "199" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:2" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "187" + lanes: "2:2" + serdes_group: "23" + speed: "100G" + sysport: "187" + type: "eth" + - fec: "KPFEC" + id: "189" + lanes: "4:2" + serdes_group: "23" + speed: "100G" + sysport: "189" + type: "eth" + - fec: "KPFEC" + id: "191" + lanes: "6:2" + serdes_group: "23" + speed: "100G" + sysport: "191" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:2" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "179" + lanes: "2:2" + serdes_group: "22" + speed: "100G" + sysport: "179" + type: "eth" + - fec: "KPFEC" + id: "181" + lanes: "4:2" + serdes_group: "22" + speed: "100G" + sysport: "181" + type: "eth" + - fec: "KPFEC" + id: "183" + lanes: "6:2" + serdes_group: "22" + speed: "100G" + sysport: "183" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:2" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "171" + lanes: "2:2" + serdes_group: "21" + speed: "100G" + sysport: "171" + type: "eth" + - fec: "KPFEC" + id: "173" + lanes: "4:2" + serdes_group: "21" + speed: "100G" + sysport: "173" + type: "eth" + - fec: "KPFEC" + id: "175" + lanes: "6:2" + serdes_group: "21" + speed: "100G" + sysport: "175" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:2" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "163" + lanes: "2:2" + serdes_group: "20" + speed: "100G" + sysport: "163" + type: "eth" + - fec: "KPFEC" + id: "165" + lanes: "4:2" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + - fec: "KPFEC" + id: "167" + lanes: "6:2" + serdes_group: "20" + speed: "100G" + sysport: "167" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:2" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "155" + lanes: "2:2" + serdes_group: "19" + speed: "100G" + sysport: "155" + type: "eth" + - fec: "KPFEC" + id: "157" + lanes: "4:2" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + - fec: "KPFEC" + id: "159" + lanes: "6:2" + serdes_group: "19" + speed: "100G" + sysport: "159" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:2" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "147" + lanes: "2:2" + serdes_group: "18" + speed: "100G" + sysport: "147" + type: "eth" + - fec: "KPFEC" + id: "149" + lanes: "4:2" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + - fec: "KPFEC" + id: "151" + lanes: "6:2" + serdes_group: "18" + speed: "100G" + sysport: "151" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:2" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "139" + lanes: "2:2" + serdes_group: "17" + speed: "100G" + sysport: "139" + type: "eth" + - fec: "KPFEC" + id: "141" + lanes: "4:2" + serdes_group: "17" + speed: "100G" + sysport: "141" + type: "eth" + - fec: "KPFEC" + id: "143" + lanes: "6:2" + serdes_group: "17" + speed: "100G" + sysport: "143" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:2" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "131" + lanes: "2:2" + serdes_group: "16" + speed: "100G" + sysport: "131" + type: "eth" + - fec: "KPFEC" + id: "133" + lanes: "4:2" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + - fec: "KPFEC" + id: "135" + lanes: "6:2" + serdes_group: "16" + speed: "100G" + sysport: "135" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:2" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "123" + lanes: "2:2" + serdes_group: "15" + speed: "100G" + sysport: "123" + type: "eth" + - fec: "KPFEC" + id: "125" + lanes: "4:2" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KPFEC" + id: "127" + lanes: "6:2" + serdes_group: "15" + speed: "100G" + sysport: "127" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:2" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "115" + lanes: "2:2" + serdes_group: "14" + speed: "100G" + sysport: "115" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:2" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "119" + lanes: "6:2" + serdes_group: "14" + speed: "100G" + sysport: "119" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:2" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "107" + lanes: "2:2" + serdes_group: "13" + speed: "100G" + sysport: "107" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:2" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "111" + lanes: "6:2" + serdes_group: "13" + speed: "100G" + sysport: "111" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:2" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "99" + lanes: "2:2" + serdes_group: "12" + speed: "100G" + sysport: "99" + type: "eth" + - fec: "KPFEC" + id: "101" + lanes: "4:2" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KPFEC" + id: "103" + lanes: "6:2" + serdes_group: "12" + speed: "100G" + sysport: "103" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:2" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "91" + lanes: "2:2" + serdes_group: "11" + speed: "100G" + sysport: "91" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:2" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "95" + lanes: "6:2" + serdes_group: "11" + speed: "100G" + sysport: "95" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:2" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "83" + lanes: "2:2" + serdes_group: "10" + speed: "100G" + sysport: "83" + type: "eth" + - fec: "KPFEC" + id: "85" + lanes: "4:2" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - fec: "KPFEC" + id: "87" + lanes: "6:2" + serdes_group: "10" + speed: "100G" + sysport: "87" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:2" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "75" + lanes: "2:2" + serdes_group: "9" + speed: "100G" + sysport: "75" + type: "eth" + - fec: "KPFEC" + id: "77" + lanes: "4:2" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - fec: "KPFEC" + id: "79" + lanes: "6:2" + serdes_group: "9" + speed: "100G" + sysport: "79" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:2" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "67" + lanes: "2:2" + serdes_group: "8" + speed: "100G" + sysport: "67" + type: "eth" + - fec: "KPFEC" + id: "69" + lanes: "4:2" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - fec: "KPFEC" + id: "71" + lanes: "6:2" + serdes_group: "8" + speed: "100G" + sysport: "71" + type: "eth" + isg: + - id: "0" + tx_polarity: "01110011" + rx_polarity: "01100111" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "1" + tx_polarity: "00111011" + rx_polarity: "01100111" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "2" + tx_polarity: "01100011" + rx_polarity: "10100111" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "3" + tx_polarity: "01111011" + rx_polarity: "00111000" + lane_swap: "73614520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "4" + tx_polarity: "01100011" + rx_polarity: "01100000" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "5" + tx_polarity: "00101011" + rx_polarity: "01000111" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "6" + tx_polarity: "01110011" + rx_polarity: "10000001" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "7" + tx_polarity: "01101111" + rx_polarity: "00011100" + lane_swap: "71324065" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "8" + tx_polarity: "00000001" + rx_polarity: "11000001" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "9" + tx_polarity: "01001001" + rx_polarity: "01000101" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "10" + tx_polarity: "01000001" + rx_polarity: "10000001" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "11" + tx_polarity: "00001101" + rx_polarity: "01001101" + lane_swap: "03215467" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "12" + tx_polarity: "00000001" + rx_polarity: "00100001" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "13" + tx_polarity: "00000101" + rx_polarity: "00101011" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "14" + tx_polarity: "00000001" + rx_polarity: "10101001" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "15" + tx_polarity: "00001101" + rx_polarity: "00001100" + lane_swap: "01235467" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "16" + tx_polarity: "00000001" + rx_polarity: "10100011" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "17" + tx_polarity: "01000101" + rx_polarity: "00101011" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "18" + tx_polarity: "01000000" + rx_polarity: "10100011" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "19" + tx_polarity: "00110111" + rx_polarity: "01010110" + lane_swap: "01235467" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "20" + tx_polarity: "01100101" + rx_polarity: "01001011" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "21" + tx_polarity: "10111011" + rx_polarity: "10101110" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "22" + tx_polarity: "01110011" + rx_polarity: "01101011" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "23" + tx_polarity: "01110011" + rx_polarity: "01011000" + lane_swap: "01235467" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "24" + tx_polarity: "01110011" + rx_polarity: "11100111" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "25" + tx_polarity: "00101011" + rx_polarity: "01100111" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "26" + tx_polarity: "01110011" + rx_polarity: "10100111" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "27" + tx_polarity: "01000111" + rx_polarity: "00011101" + lane_swap: "01235467" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "6, 6, 6, 6, 6, 6, 6, 6" + - id: "28" + tx_polarity: "01100011" + rx_polarity: "11111101" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "29" + tx_polarity: "00111011" + rx_polarity: "01101110" + lane_swap: "71635420" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "30" + tx_polarity: "01110011" + rx_polarity: "00100010" + lane_swap: "71634520" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "31" + tx_polarity: "01010011" + rx_polarity: "00110111" + lane_swap: "71235460" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "8, 8, 8, 8, 8, 8, 8, 8" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/innovium.77700_A b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/innovium.77700_A new file mode 100644 index 00000000000..84aa4198360 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/innovium.77700_B b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/ivm.sai.config.yaml b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/ivm.sai.config.yaml new file mode 100644 index 00000000000..fe9d7013d86 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_128x100G_Cameo-esc600-128q.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +NRZ_PORTS_SIG_DETECT_MODE_TL7 : "1" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/ivm.sai.datapath.config.yaml b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/pg_profile_lookup.ini b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/port_config.ini b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/port_config.ini new file mode 100644 index 00000000000..de81fe694b0 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/port_config.ini @@ -0,0 +1,129 @@ +# name lanes alias speed index mtu fec +Ethernet0 57,58 Eth1-1 100000 0 9126 rs +Ethernet2 59,60 Eth1-2 100000 1 9126 rs +Ethernet4 61,62 Eth1-3 100000 2 9126 rs +Ethernet6 63,64 Eth1-4 100000 3 9126 rs +Ethernet8 49,50 Eth1-5 100000 4 9126 rs +Ethernet10 51,52 Eth1-6 100000 5 9126 rs +Ethernet12 53,54 Eth1-7 100000 6 9126 rs +Ethernet14 55,56 Eth1-8 100000 7 9126 rs +Ethernet16 41,42 Eth1-9 100000 8 9126 rs +Ethernet18 43,44 Eth1-10 100000 9 9126 rs +Ethernet20 45,46 Eth1-11 100000 10 9126 rs +Ethernet22 47,48 Eth1-12 100000 11 9126 rs +Ethernet24 33,34 Eth1-13 100000 12 9126 rs +Ethernet26 35,36 Eth1-14 100000 13 9126 rs +Ethernet28 37,38 Eth1-15 100000 14 9126 rs +Ethernet30 39,40 Eth1-16 100000 15 9126 rs +Ethernet32 25,26 Eth2-1 100000 16 9126 rs +Ethernet34 27,28 Eth2-2 100000 17 9126 rs +Ethernet36 29,30 Eth2-3 100000 18 9126 rs +Ethernet38 31,32 Eth2-4 100000 19 9126 rs +Ethernet40 17,18 Eth2-5 100000 20 9126 rs +Ethernet42 19,20 Eth2-6 100000 21 9126 rs +Ethernet44 21,22 Eth2-7 100000 22 9126 rs +Ethernet46 23,24 Eth2-8 100000 23 9126 rs +Ethernet48 9,10 Eth2-9 100000 24 9126 rs +Ethernet50 11,12 Eth2-10 100000 25 9126 rs +Ethernet52 13,14 Eth2-11 100000 26 9126 rs +Ethernet54 15,16 Eth2-12 100000 27 9126 rs +Ethernet56 1,2 Eth2-13 100000 28 9126 rs +Ethernet58 3,4 Eth2-14 100000 29 9126 rs +Ethernet60 5,6 Eth2-15 100000 30 9126 rs +Ethernet62 7,8 Eth2-16 100000 31 9126 rs +Ethernet64 249,250 Eth3-1 100000 32 9126 rs +Ethernet66 251,252 Eth3-2 100000 33 9126 rs +Ethernet68 253,254 Eth3-3 100000 34 9126 rs +Ethernet70 255,256 Eth3-4 100000 35 9126 rs +Ethernet72 241,242 Eth3-5 100000 36 9126 rs +Ethernet74 243,244 Eth3-6 100000 37 9126 rs +Ethernet76 245,246 Eth3-7 100000 38 9126 rs +Ethernet78 247,248 Eth3-8 100000 39 9126 rs +Ethernet80 233,234 Eth3-9 100000 40 9126 rs +Ethernet82 235,236 Eth3-10 100000 41 9126 rs +Ethernet84 237,238 Eth3-11 100000 42 9126 rs +Ethernet86 239,240 Eth3-12 100000 43 9126 rs +Ethernet88 225,226 Eth3-13 100000 44 9126 rs +Ethernet90 227,228 Eth3-14 100000 45 9126 rs +Ethernet92 229,230 Eth3-15 100000 46 9126 rs +Ethernet94 231,232 Eth3-16 100000 47 9126 rs +Ethernet96 217,218 Eth4-1 100000 48 9126 rs +Ethernet98 219,220 Eth4-2 100000 49 9126 rs +Ethernet100 221,222 Eth4-3 100000 50 9126 rs +Ethernet102 223,224 Eth4-4 100000 51 9126 rs +Ethernet104 209,210 Eth4-5 100000 52 9126 rs +Ethernet106 211,212 Eth4-6 100000 53 9126 rs +Ethernet108 213,214 Eth4-7 100000 54 9126 rs +Ethernet110 215,216 Eth4-8 100000 55 9126 rs +Ethernet112 201,202 Eth4-9 100000 56 9126 rs +Ethernet114 203,204 Eth4-10 100000 57 9126 rs +Ethernet116 205,206 Eth4-11 100000 58 9126 rs +Ethernet118 207,208 Eth4-12 100000 59 9126 rs +Ethernet120 193,194 Eth4-13 100000 60 9126 rs +Ethernet122 195,196 Eth4-14 100000 61 9126 rs +Ethernet124 197,198 Eth4-15 100000 62 9126 rs +Ethernet126 199,200 Eth4-16 100000 63 9126 rs +Ethernet128 185,186 Eth5-1 100000 64 9126 rs +Ethernet130 187,188 Eth5-2 100000 65 9126 rs +Ethernet132 189,190 Eth5-3 100000 66 9126 rs +Ethernet134 191,192 Eth5-4 100000 67 9126 rs +Ethernet136 177,178 Eth5-5 100000 68 9126 rs +Ethernet138 179,180 Eth5-6 100000 69 9126 rs +Ethernet140 181,182 Eth5-7 100000 70 9126 rs +Ethernet142 183,184 Eth5-8 100000 71 9126 rs +Ethernet144 169,170 Eth5-9 100000 72 9126 rs +Ethernet146 171,172 Eth5-10 100000 73 9126 rs +Ethernet148 173,174 Eth5-11 100000 74 9126 rs +Ethernet150 175,176 Eth5-12 100000 75 9126 rs +Ethernet152 161,162 Eth5-13 100000 76 9126 rs +Ethernet154 163,164 Eth5-14 100000 77 9126 rs +Ethernet156 165,166 Eth5-15 100000 78 9126 rs +Ethernet158 167,168 Eth5-16 100000 79 9126 rs +Ethernet160 153,154 Eth6-1 100000 80 9126 rs +Ethernet162 155,156 Eth6-2 100000 81 9126 rs +Ethernet164 157,158 Eth6-3 100000 82 9126 rs +Ethernet166 159,160 Eth6-4 100000 83 9126 rs +Ethernet168 145,146 Eth6-5 100000 84 9126 rs +Ethernet170 147,148 Eth6-6 100000 85 9126 rs +Ethernet172 149,150 Eth6-7 100000 86 9126 rs +Ethernet174 151,152 Eth6-8 100000 87 9126 rs +Ethernet176 137,138 Eth6-9 100000 88 9126 rs +Ethernet178 139,140 Eth6-10 100000 89 9126 rs +Ethernet180 141,142 Eth6-11 100000 90 9126 rs +Ethernet182 143,144 Eth6-12 100000 91 9126 rs +Ethernet184 129,130 Eth6-13 100000 92 9126 rs +Ethernet186 131,132 Eth6-14 100000 93 9126 rs +Ethernet188 133,134 Eth6-15 100000 94 9126 rs +Ethernet190 135,136 Eth6-16 100000 95 9126 rs +Ethernet192 121,122 Eth7-1 100000 96 9126 rs +Ethernet194 123,124 Eth7-2 100000 97 9126 rs +Ethernet196 125,126 Eth7-3 100000 98 9126 rs +Ethernet198 127,128 Eth7-4 100000 99 9126 rs +Ethernet200 113,114 Eth7-5 100000 100 9126 rs +Ethernet202 115,116 Eth7-6 100000 101 9126 rs +Ethernet204 117,118 Eth7-7 100000 102 9126 rs +Ethernet206 119,120 Eth7-8 100000 103 9126 rs +Ethernet208 105,106 Eth7-9 100000 104 9126 rs +Ethernet210 107,108 Eth7-10 100000 105 9126 rs +Ethernet212 109,110 Eth7-11 100000 106 9126 rs +Ethernet214 111,112 Eth7-12 100000 107 9126 rs +Ethernet216 97,98 Eth7-13 100000 108 9126 rs +Ethernet218 99,100 Eth7-14 100000 109 9126 rs +Ethernet220 101,102 Eth7-15 100000 110 9126 rs +Ethernet222 103,104 Eth7-16 100000 111 9126 rs +Ethernet224 89,90 Eth8-1 100000 112 9126 rs +Ethernet226 91,92 Eth8-2 100000 113 9126 rs +Ethernet228 93,94 Eth8-3 100000 114 9126 rs +Ethernet230 95,96 Eth8-4 100000 115 9126 rs +Ethernet232 81,82 Eth8-5 100000 116 9126 rs +Ethernet234 83,84 Eth8-6 100000 117 9126 rs +Ethernet236 85,86 Eth8-7 100000 118 9126 rs +Ethernet238 87,88 Eth8-8 100000 119 9126 rs +Ethernet240 73,74 Eth8-9 100000 120 9126 rs +Ethernet242 75,76 Eth8-10 100000 121 9126 rs +Ethernet244 77,78 Eth8-11 100000 122 9126 rs +Ethernet246 79,80 Eth8-12 100000 123 9126 rs +Ethernet248 65,66 Eth8-13 100000 124 9126 rs +Ethernet250 67,68 Eth8-14 100000 125 9126 rs +Ethernet252 69,70 Eth8-15 100000 126 9126 rs +Ethernet254 71,72 Eth8-16 100000 127 9126 rs diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos.json.j2 b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos.json.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos_defaults_def_lossy.j2 new file mode 100644 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/sai.profile b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/esc600-128q/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/installer.conf b/device/cameo/x86_64-cameo_esc600_128q-r0/installer.conf new file mode 100644 index 00000000000..925a32fc0c3 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/platform_reboot b/device/cameo/x86_64-cameo_esc600_128q-r0/platform_reboot new file mode 100755 index 00000000000..c54d47e55b9 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/platform_reboot @@ -0,0 +1,18 @@ +#!/bin/sh + +mr_reboot() { + + #echo "mr_reboot" + sudo rmmod x86-64-cameo-esc600-128q + sudo i2cset -y 0 0x30 0xa1 0 + +} + +if [ $# -eq 0 ] || [ $@ = "-f" ] || [ $@ = "--force" ] || [ $@ = "reboot" ]; then + mr_reboot +elif [ $@ = "-p" ] ; then + # echo "sudo halt" + sudo halt +else + echo "unsupported option" +fi diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/eeprom.py b/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/eeprom.py new file mode 100755 index 00000000000..5b6ed4606b4 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/eeprom.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/psuutil.py b/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/psuutil.py new file mode 100755 index 00000000000..16737add884 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/psuutil.py @@ -0,0 +1,95 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/ESC600_POWER/' + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + + # Get sysfs attribute + def get_attr_value(self, path): + + retval = 'ERR' + if (not os.path.isfile(path)): + return retval + + try: + with open(path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", path, " file !") + + retval = retval.rstrip('\r\n') + return retval + + 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 + """ + MAX_PSUS = 4 + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 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 + """ + status = 0 + attr_file = 'psu{}_good'.format(index) + status_path = attr_path + attr_file + try: + reg_file = open(status_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 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 = 0 + attr_file ='psu{}_prnt'.format(index) + presence_path = attr_path + attr_file + try: + reg_file = open(presence_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/sfputil.py b/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/sfputil.py new file mode 100755 index 00000000000..327ba748ccf --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/plugins/sfputil.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python + +try: + import time + import json + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PLATFORM_INSTALL_INFO_FILE = "/etc/sonic/platform_install.json" +PLATFORM_SFP_GROUPS = ['SFP-G11', 'SFP-G12', 'SFP-G21', 'SFP-G22', 'SFP-G31', 'SFP-G32', 'SFP-G41', 'SFP-G42', + 'SFP-G51', + 'SFP-G52', 'SFP-G61', 'SFP-G62', 'SFP-G71', 'SFP-G72', 'SFP-G81', 'SFP-G82'] +PLATFORM_CARD_LIST = ['PHY_CPLD_1', 'PHY_CPLD_2', 'PHY_CPLD_3', 'PHY_CPLD_4', 'PHY_CPLD_5', 'PHY_CPLD_6', 'PHY_CPLD_7', + 'PHY_CPLD_8'] + + +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" + + _port_start = 0 + _port_end = 127 + _port_to_eeprom_mapping = {} + _global_port_pres_dict = {} + _port_status_mapping = [] + + def __init__(self): + eeprom_path = "{}/eeprom" + eeprom_path_list, status_path_list = self.get_sfp_path() + self._port_end = len(status_path_list) - 1 + self._port_status_mapping = status_path_list + for x in range(self._port_start, self._port_end + 1): + port_eeprom_path = eeprom_path.format(eeprom_path_list[x]) + self._port_to_eeprom_mapping[x] = port_eeprom_path + self.init_global_port_presence() + SfpUtilBase.__init__(self) + + def get_attr_value(self, attr_path): + retval = 'ERR' + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + except Exception as error: + print("Unable to open ", attr_path, " file !") + return retval + retval = retval.rstrip('\r\n') + fd.close() + return retval + + def get_sfp_path(self): + eeprom_path_list=[] + status_path_list=[] + with open(PLATFORM_INSTALL_INFO_FILE) as fd: + install_info = json.load(fd) + for sfp_group_name in PLATFORM_SFP_GROUPS: + sfp_group = install_info[2][sfp_group_name] + for i in range(0,sfp_group['number']): + eeprom_path_list.append(sfp_group['paths'][i]) + for card_name in PLATFORM_CARD_LIST: + card = install_info[1][card_name] + if card['portnum'] == 0: + continue + for i in range(1,card['portnum']+1): + present_file = card['hwmon_path']+'/device/'+'QSFP_present_{}'.format(i) + lp_file = card['hwmon_path']+'/device/'+'QSFP_low_power_{}'.format(i) + reset_file = card['hwmon_path']+'/device/'+'QSFP_reset_{}'.format(i) + status_path_list.append([present_file,lp_file,reset_file]) + return eeprom_path_list, status_path_list + def reset(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + pos = self._port_status_mapping[port_num] + path = pos[2] + try: + reg_file = open(path, 'w') + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + reg_file.write(str(port_num + 1)) + reg_file.close() + 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 + pos = self._port_status_mapping[port_num] + path = pos[1] + try: + reg_file = open(path, 'w') + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + # the gpio pin is ACTIVE_HIGH + if lpmode is True: + val = "1" + else: + val = "0" + # write value to gpio + reg_file.seek(0) + reg_file.write(val) + reg_file.close() + return True + + 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 + pos = self._port_status_mapping[port_num] + path = pos[1] + res = self.get_attr_value(path) + if res == 'ERR': + return False + if int(res) == 1: + return True + return False + + 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 + pos = self._port_status_mapping[port_num] + path = pos[0] + res = self.get_attr_value(path) + if res == 'ERR': + return False + if int(res) == 1: + return True + return False + + 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 get_transceiver_change_event(self, timeout=0): + 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(1) + + @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(0, self._port_end + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/pmon_daemon_control.json b/device/cameo/x86_64-cameo_esc600_128q-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/sensors.conf b/device/cameo/x86_64-cameo_esc600_128q-r0/sensors.conf new file mode 100644 index 00000000000..4d4615524ec --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/sensors.conf @@ -0,0 +1,22 @@ +bus "i2c-43" "i2c-0-mux (chan_id 2)" +chip "g781-i2c-43-4c" + label temp1 "local temp sensor" + label temp2 "Sensor on left bottom PCB" + +bus "i2c-44" "i2c-0-mux (chan_id 3)" +chip "g781-i2c-44-4c" + label temp1 "local temp sensor" + label temp2 "Sensor on rear bottom PCB" + +bus "i2c-42" "i2c-0-mux (chan_id 1)" +chip "g781-i2c-42-4c" + label temp1 "local temp sensor" + label temp2 "Sensor on rear center PCB" + +bus "i2c-41" "i2c-0-mux (chan_id 0)" +chip "nct7511-i2c-*-2e" + label temp1 "local temp sensor" + label temp2 "Sensor on right bottom PCB" + ignore fan1 + + diff --git a/device/cameo/x86_64-cameo_esc600_128q-r0/topo.conf b/device/cameo/x86_64-cameo_esc600_128q-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/cameo/x86_64-cameo_esc600_128q-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/default_sku b/device/cameo/x86_64-cameo_esc601_32q-r0/default_sku new file mode 100755 index 00000000000..1ef6d57d344 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/default_sku @@ -0,0 +1 @@ +esc601-32q t1 diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers.json.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers.json.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/config_32x100G_Cameo-esc601-32q.yaml b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/config_32x100G_Cameo-esc601-32q.yaml new file mode 100644 index 00000000000..ec613635d19 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/config_32x100G_Cameo-esc601-32q.yaml @@ -0,0 +1,418 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + wred_cr_ip_proto_list: "17" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KRFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + isg: + - id: "0" + tx_polarity: "11011111" + rx_polarity: "10001000" + lane_swap: "67543210" + - id: "1" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "2" + tx_polarity: "11011000" + rx_polarity: "10001110" + lane_swap: "67543210" + - id: "3" + tx_polarity: "11101110" + rx_polarity: "01001000" + lane_swap: "67542310" + - id: "4" + tx_polarity: "11001000" + rx_polarity: "11000110" + lane_swap: "67542310" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "6" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "8" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "10" + tx_polarity: "10100100" + rx_polarity: "10101100" + lane_swap: "67451320" + - id: "11" + tx_polarity: "10000000" + rx_polarity: "11111011" + lane_swap: "67542310" + - id: "12" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "13" + tx_polarity: "11001001" + rx_polarity: "01001110" + lane_swap: "76542310" + - id: "14" + tx_polarity: "01000100" + rx_polarity: "01010110" + lane_swap: "67452301" + - id: "15" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "16" + tx_polarity: "00000000" + rx_polarity: "01111101" + lane_swap: "67542310" + - id: "17" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "18" + tx_polarity: "11101101" + rx_polarity: "01001101" + lane_swap: "76542310" + - id: "19" + tx_polarity: "00111111" + rx_polarity: "10101100" + lane_swap: "67542310" + - id: "20" + tx_polarity: "11101100" + rx_polarity: "01001000" + lane_swap: "67542310" + - id: "21" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "23" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "24" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "25" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "26" + tx_polarity: "10001110" + rx_polarity: "11000100" + lane_swap: "67542310" + - id: "27" + tx_polarity: "11000101" + rx_polarity: "01001010" + lane_swap: "76542310" + - id: "28" + tx_polarity: "11001000" + rx_polarity: "10000111" + lane_swap: "67542310" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "00101110" + lane_swap: "67452310" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "31" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/innovium.77700_B b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/ivm.sai.config.yaml b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/ivm.sai.config.yaml new file mode 100644 index 00000000000..d4bd1028d9a --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Cameo-esc601-32q.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +NRZ_PORTS_SIG_DETECT_MODE_TL7 : "1" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/ivm.sai.datapath.config.yaml b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/pg_profile_lookup.ini b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/port_config.ini b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/port_config.ini new file mode 100644 index 00000000000..2ed67a20b83 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 33,34,35,36 Eth1 100000 0 9126 rs +Ethernet4 37,38,39,40 Eth2 100000 1 9126 rs +Ethernet8 25,26,27,28 Eth3 100000 2 9126 rs +Ethernet12 29,30,31,32 Eth4 100000 3 9126 rs +Ethernet16 17,18,19,20 Eth5 100000 4 9126 rs +Ethernet20 21,22,23,24 Eth6 100000 5 9126 rs +Ethernet24 1,2,3,4 Eth7 100000 6 9126 rs +Ethernet28 5,6,7,8 Eth8 100000 7 9126 rs +Ethernet32 233,234,235,236 Eth9 100000 8 9126 rs +Ethernet36 237,238,239,240 Eth10 100000 9 9126 rs +Ethernet40 225,226,227,228 Eth11 100000 10 9126 rs +Ethernet44 229,230,231,232 Eth12 100000 11 9126 rs +Ethernet48 217,218,219,220 Eth13 100000 12 9126 rs +Ethernet52 221,222,223,224 Eth14 100000 13 9126 rs +Ethernet56 209,210,211,212 Eth15 100000 14 9126 rs +Ethernet60 213,214,215,216 Eth16 100000 15 9126 rs +Ethernet64 161,162,163,164 Eth17 100000 16 9126 rs +Ethernet68 165,166,167,168 Eth18 100000 17 9126 rs +Ethernet72 153,154,155,156 Eth19 100000 18 9126 rs +Ethernet76 157,158,159,160 Eth20 100000 19 9126 rs +Ethernet80 145,146,147,148 Eth21 100000 20 9126 rs +Ethernet84 149,150,151,152 Eth22 100000 21 9126 rs +Ethernet88 129,130,131,132 Eth23 100000 22 9126 rs +Ethernet92 133,134,135,136 Eth24 100000 23 9126 rs +Ethernet96 113,114,115,116 Eth25 100000 24 9126 rs +Ethernet100 117,118,119,120 Eth26 100000 25 9126 rs +Ethernet104 105,106,107,108 Eth27 100000 26 9126 rs +Ethernet108 109,110,111,112 Eth28 100000 27 9126 rs +Ethernet112 89,90,91,92 Eth29 100000 28 9126 rs +Ethernet116 93,94,95,96 Eth30 100000 29 9126 rs +Ethernet120 81,82,83,84 Eth31 100000 30 9126 rs +Ethernet124 85,86,87,88 Eth32 100000 31 9126 rs diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos.json.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos.json.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos_defaults_def_lossy.j2 new file mode 100644 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/sai.profile b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/esc601-32q/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers.json.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers.json.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/config_32x200G_Cameo-esc601-32q.yaml b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/config_32x200G_Cameo-esc601-32q.yaml new file mode 100644 index 00000000000..53b8ce036f9 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/config_32x200G_Cameo-esc601-32q.yaml @@ -0,0 +1,418 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + wred_cr_ip_proto_list: "17" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "200G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "200G" + sysport: "37" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "200G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "200G" + sysport: "29" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "200G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "200G" + sysport: "21" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "200G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "200G" + sysport: "5" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "200G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "200G" + sysport: "237" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "200G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "200G" + sysport: "229" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "200G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "200G" + sysport: "221" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "200G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "200G" + sysport: "213" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "200G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "200G" + sysport: "165" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "200G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "200G" + sysport: "157" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "200G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "200G" + sysport: "149" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "200G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "200G" + sysport: "133" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "200G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "200G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "200G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "200G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "200G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "200G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "200G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "200G" + sysport: "85" + type: "eth" + isg: + - id: "0" + tx_polarity: "11011111" + rx_polarity: "10001000" + lane_swap: "67543210" + - id: "1" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "2" + tx_polarity: "11011000" + rx_polarity: "10001110" + lane_swap: "67543210" + - id: "3" + tx_polarity: "11101110" + rx_polarity: "01001000" + lane_swap: "67542310" + - id: "4" + tx_polarity: "11001000" + rx_polarity: "11000110" + lane_swap: "67542310" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "6" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "8" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "10" + tx_polarity: "10100100" + rx_polarity: "10101100" + lane_swap: "67451320" + - id: "11" + tx_polarity: "10000000" + rx_polarity: "11111011" + lane_swap: "67542310" + - id: "12" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "13" + tx_polarity: "11001001" + rx_polarity: "01001110" + lane_swap: "76542310" + - id: "14" + tx_polarity: "01000100" + rx_polarity: "01010110" + lane_swap: "67452301" + - id: "15" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "16" + tx_polarity: "00000000" + rx_polarity: "01111101" + lane_swap: "67542310" + - id: "17" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "18" + tx_polarity: "11101101" + rx_polarity: "01001101" + lane_swap: "76542310" + - id: "19" + tx_polarity: "00111111" + rx_polarity: "10101100" + lane_swap: "67542310" + - id: "20" + tx_polarity: "11101100" + rx_polarity: "01001000" + lane_swap: "67542310" + - id: "21" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "23" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "24" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "25" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "26" + tx_polarity: "10001110" + rx_polarity: "11000100" + lane_swap: "67542310" + - id: "27" + tx_polarity: "11000101" + rx_polarity: "01001010" + lane_swap: "76542310" + - id: "28" + tx_polarity: "11001000" + rx_polarity: "10000111" + lane_swap: "67542310" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "00101110" + lane_swap: "67452310" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "31" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/innovium.77700_B b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/ivm.sai.config.yaml b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/ivm.sai.config.yaml new file mode 100644 index 00000000000..8b54535123c --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x200G_Cameo-esc601-32q.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +NRZ_PORTS_SIG_DETECT_MODE_TL7 : "1" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/ivm.sai.datapath.config.yaml b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/pg_profile_lookup.ini b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/port_config.ini b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/port_config.ini new file mode 100644 index 00000000000..7ce5bbd4588 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/port_config.ini @@ -0,0 +1,33 @@ +# name lanes speed index mtu fec +Ethernet0 33,34,35,36 200000 0 9126 rs +Ethernet4 37,38,39,40 200000 1 9126 rs +Ethernet8 25,26,27,28 200000 2 9126 rs +Ethernet12 29,30,31,32 200000 3 9126 rs +Ethernet16 17,18,19,20 200000 4 9126 rs +Ethernet20 21,22,23,24 200000 5 9126 rs +Ethernet24 1,2,3,4 200000 6 9126 rs +Ethernet28 5,6,7,8 200000 7 9126 rs +Ethernet32 233,234,235,236 200000 8 9126 rs +Ethernet36 237,238,239,240 200000 9 9126 rs +Ethernet40 225,226,227,228 200000 10 9126 rs +Ethernet44 229,230,231,232 200000 11 9126 rs +Ethernet48 217,218,219,220 200000 12 9126 rs +Ethernet52 221,222,223,224 200000 13 9126 rs +Ethernet56 209,210,211,212 200000 14 9126 rs +Ethernet60 213,214,215,216 200000 15 9126 rs +Ethernet64 161,162,163,164 200000 16 9126 rs +Ethernet68 165,166,167,168 200000 17 9126 rs +Ethernet72 153,154,155,156 200000 18 9126 rs +Ethernet76 157,158,159,160 200000 19 9126 rs +Ethernet80 145,146,147,148 200000 20 9126 rs +Ethernet84 149,150,151,152 200000 21 9126 rs +Ethernet88 129,130,131,132 200000 22 9126 rs +Ethernet92 133,134,135,136 200000 23 9126 rs +Ethernet96 113,114,115,116 200000 24 9126 rs +Ethernet100 117,118,119,120 200000 25 9126 rs +Ethernet104 105,106,107,108 200000 26 9126 rs +Ethernet108 109,110,111,112 200000 27 9126 rs +Ethernet112 89,90,91,92 200000 28 9126 rs +Ethernet116 93,94,95,96 200000 29 9126 rs +Ethernet120 81,82,83,84 200000 30 9126 rs +Ethernet124 85,86,87,88 200000 31 9126 rs diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos.json.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos.json.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos_defaults_def_lossy.j2 new file mode 100644 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/sai.profile b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/escc600-32q/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/installer.conf b/device/cameo/x86_64-cameo_esc601_32q-r0/installer.conf new file mode 100644 index 00000000000..925a32fc0c3 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/platform_reboot b/device/cameo/x86_64-cameo_esc601_32q-r0/platform_reboot new file mode 100755 index 00000000000..d6699b743d1 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/platform_reboot @@ -0,0 +1,18 @@ +#!/bin/sh + +mr_reboot() { + + #echo "mr_reboot" + sudo rmmod x86-64-cameo-esc601-32q + sudo i2cset -y 0 0x30 0xa4 0 + +} + +if [ $# -eq 0 ] || [ $@ = "-f" ] || [ $@ = "--force" ] || [ $@ = "reboot" ]; then + mr_reboot +elif [ $@ = "-p" ] ; then + # echo "sudo halt" + sudo halt +else + echo "unsupported option" +fi diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/eeprom.py b/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/eeprom.py new file mode 100644 index 00000000000..5b6ed4606b4 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/eeprom.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/psuutil.py b/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/psuutil.py new file mode 100644 index 00000000000..ef8d36b60a3 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/psuutil.py @@ -0,0 +1,102 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/' + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/i2c-10/10-0050", + "/sys/bus/i2c/devices/i2c-9/9-0050"] + + def __init__(self): + PsuBase.__init__(self) + + + # Get sysfs attribute + def get_attr_value(self, path): + + retval = 'ERR' + if (not os.path.isfile(path)): + return retval + + try: + with open(path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", path, " file !") + + retval = retval.rstrip('\r\n') + return retval + + 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 + """ + MAX_PSUS = 2 + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 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 + """ + status = 0 + attr_file = 'psu_status' + status_path = attr_path+'/ESC601_PSU/' + attr_file + try: + reg_file = open(status_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text_lines = reg_file.read() + + search_str = "PSU {} is power Good".format(index) + + if search_str in text_lines: + status = 1 + + reg_file.close() + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 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 = 0 + attr_file ='psu_present' + presence_path = attr_path+'ESC601_PSU/' + attr_file + try: + reg_file = open(presence_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text_lines = reg_file.read() + + search_str = "PSU {} is present".format(index) + + if search_str in text_lines: + status = 1 + + reg_file.close() + + return status + diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/sfputil.py b/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/sfputil.py new file mode 100644 index 00000000000..8fd0f8f9110 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/plugins/sfputil.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python + +try: + import time + import json + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/' +PLATFORM_INSTALL_INFO_FILE="/etc/sonic/platform_install.json" +PLATFORM_SFP_GROUPS = ['SFP-G01','SFP-G02','SFP-G03','SFP-G04'] + +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" + + _port_start = 0 + _port_end = 31 + _port_in_block =32 + _port_to_eeprom_mapping = {} + _global_port_pres_dict = {} + + def __init__(self): + eeprom_path = "{}/eeprom" + path_list = self.get_sfp_path() + for x in range(self._port_start, self._port_end + 1): + port_eeprom_path = eeprom_path.format(path_list[x]) + self._port_to_eeprom_mapping[x] = port_eeprom_path + + self.init_global_port_presence() + SfpUtilBase.__init__(self) + + def get_sfp_path(self): + map = [] + with open(PLATFORM_INSTALL_INFO_FILE) as fd: + install_info = json.load(fd) + for sfp_group_name in PLATFORM_SFP_GROUPS: + sfp_group = install_info[2][sfp_group_name] + map = map + sfp_group['paths'] + return map + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + path = attr_path+'ESC601_QSFP/QSFP_reset' + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + #toggle reset + #reg_file.seek(0) + reg_file.write(str(port_num+1)) + #time.sleep(1) + #reg_file.seek(0) + #reg_file.write('0') + reg_file.close() + 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 + + path = attr_path+'ESC601_QSFP/QSFP_low_power_'+str(port_num+1) + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + # the gpio pin is ACTIVE_HIGH + if lpmode is True: + val = "1" + else: + val = "0" + + # write value to gpio + reg_file.seek(0) + reg_file.write(val) + reg_file.close() + + return True + + 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 + + path = attr_path+'ESC601_QSFP/QSFP_low_power_'+str(port_num+1) + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + text_lines = reg_file.readline() + reg_file.close() + if text_lines.find('OFF') < 0: + return True + + return False + + 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 + + path = attr_path+'ESC601_QSFP/QSFP_present' + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text_lines = reg_file.readlines() + reg_file.close() + if text_lines[port_num].find('not') < 0: + return True + + return False + + 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 get_transceiver_change_event(self, timeout=0): + 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(1) + + @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(0, self._port_in_block + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/pmon_daemon_control.json b/device/cameo/x86_64-cameo_esc601_32q-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/sensors.conf b/device/cameo/x86_64-cameo_esc601_32q-r0/sensors.conf new file mode 100644 index 00000000000..4d4615524ec --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/sensors.conf @@ -0,0 +1,22 @@ +bus "i2c-43" "i2c-0-mux (chan_id 2)" +chip "g781-i2c-43-4c" + label temp1 "local temp sensor" + label temp2 "Sensor on left bottom PCB" + +bus "i2c-44" "i2c-0-mux (chan_id 3)" +chip "g781-i2c-44-4c" + label temp1 "local temp sensor" + label temp2 "Sensor on rear bottom PCB" + +bus "i2c-42" "i2c-0-mux (chan_id 1)" +chip "g781-i2c-42-4c" + label temp1 "local temp sensor" + label temp2 "Sensor on rear center PCB" + +bus "i2c-41" "i2c-0-mux (chan_id 0)" +chip "nct7511-i2c-*-2e" + label temp1 "local temp sensor" + label temp2 "Sensor on right bottom PCB" + ignore fan1 + + diff --git a/device/cameo/x86_64-cameo_esc601_32q-r0/topo.conf b/device/cameo/x86_64-cameo_esc601_32q-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/cameo/x86_64-cameo_esc601_32q-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/default_sku b/device/cameo/x86_64-cameo_esc602_32q-r0/default_sku new file mode 100644 index 00000000000..8824c5d7c4d --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/default_sku @@ -0,0 +1 @@ +esc602-32q t1 diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers.json.j2 b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers.json.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..72a618f07f4 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/config_32x100G_Cameo-esc602-32q.yaml b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/config_32x100G_Cameo-esc602-32q.yaml new file mode 100644 index 00000000000..346c61d8287 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/config_32x100G_Cameo-esc602-32q.yaml @@ -0,0 +1,397 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.55300" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + skip_pll_check: "false" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + mac_clk: "750" + sys_clk: "1300" + ifc_clk: "675" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + devports: + - id: "0" + sysport: "129" + type: "cpu" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" +# Aux ports to be enabled later +# - id: "33" +# fec: "NONE" +# lanes: "0:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "33" +# type: "mgmt 0" +# - id: "34" +# fec: "NONE" +# lanes: "1:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "34" +# type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "00001010" + rx_polarity: "01001001" + lane_swap: "46750132" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "1" + tx_polarity: "00011111" + rx_polarity: "01101001" + lane_swap: "46752130" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "2" + tx_polarity: "00101000" + rx_polarity: "11110111" + lane_swap: "57462301" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "3" + tx_polarity: "00111101" + rx_polarity: "00101101" + lane_swap: "67542301" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "4" + tx_polarity: "01110110" + rx_polarity: "01111101" + lane_swap: "76543021" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "5" + tx_polarity: "00100100" + rx_polarity: "01101010" + lane_swap: "76542103" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "6" + tx_polarity: "11000011" + rx_polarity: "11110101" + lane_swap: "45672013" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "7" + tx_polarity: "10011101" + rx_polarity: "11111010" + lane_swap: "74562103" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "8" + tx_polarity: "01001000" + rx_polarity: "00100011" + lane_swap: "54672301" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "9" + tx_polarity: "11111111" + rx_polarity: "01110111" + lane_swap: "46750321" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "10" + tx_polarity: "10011110" + rx_polarity: "10110000" + lane_swap: "67542310" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "11" + tx_polarity: "01010010" + rx_polarity: "10101011" + lane_swap: "65741302" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "12" + tx_polarity: "11010110" + rx_polarity: "01101001" + lane_swap: "45760321" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "13" + tx_polarity: "01110111" + rx_polarity: "00101000" + lane_swap: "45670123" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "14" + tx_polarity: "11110110" + rx_polarity: "10111100" + lane_swap: "67542013" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "15" + tx_polarity: "01011011" + rx_polarity: "01101000" + lane_swap: "64572103" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + + diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/innovium.55300 b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/innovium.55300 new file mode 100644 index 00000000000..59383ec30ec --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/innovium.55300 @@ -0,0 +1,62 @@ +sku: innovium.55300 + +device_id: 0x1b59 + +# Hardware constraint information +hardware: + num_ibs: 2 + ib_active: 0, 1 + + ports_per_ib: 64, 64 + recirc_port_num: 64, 64 + cpu_port_num: 65 + cpu_port_ib: 0 + mgmt_port_num: 65, 66 + mgmt_port_ibs: 1, 1 + + pics_per_ib: 9, 9 + pic_ports_per_pic: 8 + max_serdes_speed: 25 + + num_shared_pics: 0 + + isg [0-7]: + ib: 0 + pic_id: [0-7] + + isg 8: + ib: 1 + pic_id: 7 + + isg 9: + ib: 1 + pic_id: 6 + + isg 10: + ib: 1 + pic_id: 5 + + isg 11: + ib: 1 + pic_id: 4 + + isg 12: + ib: 1 + pic_id: 3 + + isg 13: + ib: 1 + pic_id: 2 + + isg 14: + ib: 1 + pic_id: 1 + + isg 15: + ib: 1 + pic_id: 0 + + isg 16: + mode: 0:2 + ib: 1 + pic_id: 8 diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/ivm.sai.config.yaml b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/ivm.sai.config.yaml new file mode 100644 index 00000000000..685578a8788 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Cameo-esc602-32q.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55300" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "64" diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/ivm.sai.datapath.config.yaml b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..ef4bc6d129c --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/pg_profile_lookup.ini b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/port_config.ini b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/port_config.ini new file mode 100644 index 00000000000..7cb58b4120c --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/port_config.ini @@ -0,0 +1,33 @@ +# name lanes speed index mtu fec +Ethernet0 121,122,123,124 100000 0 9126 rs +Ethernet4 125,126,127,128 100000 1 9126 rs +Ethernet8 113,114,115,116 100000 2 9126 rs +Ethernet12 117,118,119,120 100000 3 9126 rs +Ethernet16 105,106,107,108 100000 4 9126 rs +Ethernet20 109,110,111,112 100000 5 9126 rs +Ethernet24 97,98,99,100 100000 6 9126 rs +Ethernet28 101,102,103,104 100000 7 9126 rs +Ethernet32 89,90,91,92 100000 8 9126 rs +Ethernet36 93,94,95,96 100000 9 9126 rs +Ethernet40 81,82,83,84 100000 10 9126 rs +Ethernet44 85,86,87,88 100000 11 9126 rs +Ethernet48 73,74,75,76 100000 12 9126 rs +Ethernet52 77,78,79,80 100000 13 9126 rs +Ethernet56 65,66,67,68 100000 14 9126 rs +Ethernet60 69,70,71,72 100000 15 9126 rs +Ethernet64 57,58,59,60 100000 16 9126 rs +Ethernet68 61,62,63,64 100000 17 9126 rs +Ethernet72 49,50,51,52 100000 18 9126 rs +Ethernet76 53,54,55,56 100000 19 9126 rs +Ethernet80 41,42,43,44 100000 20 9126 rs +Ethernet84 45,46,47,48 100000 21 9126 rs +Ethernet88 33,34,35,36 100000 22 9126 rs +Ethernet92 37,38,39,40 100000 23 9126 rs +Ethernet96 25,26,27,28 100000 24 9126 rs +Ethernet100 29,30,31,32 100000 25 9126 rs +Ethernet104 17,18,19,20 100000 26 9126 rs +Ethernet108 21,22,23,24 100000 27 9126 rs +Ethernet112 9,10,11,12 100000 28 9126 rs +Ethernet116 13,14,15,16 100000 29 9126 rs +Ethernet120 1,2,3,4 100000 30 9126 rs +Ethernet124 5,6,7,8 100000 31 9126 rs diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos.json.j2 b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos.json.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos_defaults_def_lossy.j2 new file mode 100644 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos_defaults_t1.j2 b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/sai.profile b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/esc602-32q/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/installer.conf b/device/cameo/x86_64-cameo_esc602_32q-r0/installer.conf new file mode 100644 index 00000000000..925a32fc0c3 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/platform_reboot b/device/cameo/x86_64-cameo_esc602_32q-r0/platform_reboot new file mode 100755 index 00000000000..07a68d4f6f0 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/platform_reboot @@ -0,0 +1,16 @@ +#!/bin/sh + +mr_reboot() { + + sudo rmmod x86-64-cameo-esc602-32q + sudo i2cset -y 0 0x30 0xa1 0 + +} + +if [ $# -eq 0 ] || [ $@ = "-f" ] || [ $@ = "--force" ] || [ $@ = "reboot" ]; then + mr_reboot +elif [ $@ = "-p" ] ; then + sudo halt +else + echo "unsupported option" +fi diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/eeprom.py b/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/eeprom.py new file mode 100755 index 00000000000..5b6ed4606b4 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/eeprom.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/psuutil.py b/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/psuutil.py new file mode 100755 index 00000000000..6c2f35565bb --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/psuutil.py @@ -0,0 +1,95 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/ESC602_POWER/' + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + + # Get sysfs attribute + def get_attr_value(self, path): + + retval = 'ERR' + if (not os.path.isfile(path)): + return retval + + try: + with open(path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", path, " file !") + + retval = retval.rstrip('\r\n') + return retval + + 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 + """ + MAX_PSUS = 2 + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 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 + """ + status = 0 + attr_file = 'psu{}_good'.format(index) + status_path = attr_path + attr_file + try: + reg_file = open(status_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 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 = 0 + attr_file ='psu{}_prnt'.format(index) + presence_path = attr_path + attr_file + try: + reg_file = open(presence_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/sfputil.py b/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/sfputil.py new file mode 100755 index 00000000000..bad935f6ea6 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/plugins/sfputil.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python + +try: + import time + import json + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/' +PLATFORM_INSTALL_INFO_FILE="/etc/sonic/platform_install.json" +PLATFORM_SFP_GROUPS = ['SFP-G01','SFP-G02','SFP-G03','SFP-G04'] + +QSFP_RESET_FILE = 'ESC602_QSFP/qsfp{}_reset' +QSFP_LOWPOWER_FILE = 'ESC602_QSFP/qsfp{}_low_power' +QSFP_PRESENT_FILE = 'ESC602_QSFP/qsfp{}_present' + +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" + + _port_start = 0 + _port_end = 31 + _port_in_block =32 + _port_to_eeprom_mapping = {} + _global_port_pres_dict = {} + + def __init__(self): + eeprom_path = "{}/eeprom" + path_list = self.get_sfp_path() + for x in range(self._port_start, self._port_end + 1): + port_eeprom_path = eeprom_path.format(path_list[x]) + self._port_to_eeprom_mapping[x] = port_eeprom_path + + self.init_global_port_presence() + SfpUtilBase.__init__(self) + + def get_sfp_path(self): + map = [] + with open(PLATFORM_INSTALL_INFO_FILE) as fd: + install_info = json.load(fd) + for sfp_group_name in PLATFORM_SFP_GROUPS: + sfp_group = install_info[2][sfp_group_name] + map = map + sfp_group['paths'] + return map + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + path = attr_path+QSFP_RESET_FILE.format(port_num+1) + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + reg_file.seek(0) + reg_file.write('1') + + reg_file.close() + 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 + + path = attr_path+QSFP_LOWPOWER_FILE.format(port_num+1) + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + # the gpio pin is ACTIVE_HIGH + if lpmode is True: + val = "1" + else: + val = "0" + + # write value to gpio + reg_file.seek(0) + reg_file.write(val) + reg_file.close() + + return True + + 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 + + path = attr_path+QSFP_LOWPOWER_FILE.format(port_num+1) + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + text = reg_file.read() + reg_file.close() + if int(text) == 1: + return True + + return False + + 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 + + path = attr_path+QSFP_PRESENT_FILE.format(port_num+1) + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + reg_file.close() + if int(text) == 1: + return True + + return False + + 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 get_transceiver_change_event(self, timeout=0): + 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(1) + + @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(0, self._port_in_block + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/pmon_daemon_control.json b/device/cameo/x86_64-cameo_esc602_32q-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/sensors.conf b/device/cameo/x86_64-cameo_esc602_32q-r0/sensors.conf new file mode 100644 index 00000000000..b28b04f6431 --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/sensors.conf @@ -0,0 +1,3 @@ + + + diff --git a/device/cameo/x86_64-cameo_esc602_32q-r0/topo.conf b/device/cameo/x86_64-cameo_esc602_32q-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/cameo/x86_64-cameo_esc602_32q-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/default_sku b/device/cameo/x86_64-cameo_escc601_32q-r0/default_sku new file mode 100644 index 00000000000..96da15b8893 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/default_sku @@ -0,0 +1 @@ +escc601-32q t1 diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers.json.j2 b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers.json.j2 new file mode 100644 index 00000000000..380e5d6a4d7 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers.json.j2 @@ -0,0 +1,134 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "23201280", + "type": "ingress", + "xoff": "7104000" + }, + "lossy_pool": { + "size": "27601920", + "type": "egress" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..82cfd1b96d4 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers_defaults_def_lossy.j2 @@ -0,0 +1,36 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers_defaults_t1.j2 b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..380e5d6a4d7 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/buffers_defaults_t1.j2 @@ -0,0 +1,134 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "23201280", + "type": "ingress", + "xoff": "7104000" + }, + "lossy_pool": { + "size": "27601920", + "type": "egress" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/config_32x200G_Cameo-escc601-32q.yaml b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/config_32x200G_Cameo-escc601-32q.yaml new file mode 100644 index 00000000000..5bf5c0dd2ff --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/config_32x200G_Cameo-escc601-32q.yaml @@ -0,0 +1,397 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.55610" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + skip_pll_check: "false" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + mac_clk: "1340" + sys_clk: "2000" + ifc_clk: "1000" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "200G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "200G" + sysport: "125" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "200G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "200G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "200G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "200G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "200G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "200G" + sysport: "101" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "200G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "200G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "200G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "200G" + sysport: "85" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "200G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "200G" + sysport: "77" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "200G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "200G" + sysport: "69" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "200G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "200G" + sysport: "61" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "200G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "200G" + sysport: "53" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "200G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "200G" + sysport: "45" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "200G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "200G" + sysport: "37" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "200G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "200G" + sysport: "29" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "200G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "200G" + sysport: "21" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "200G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "200G" + sysport: "13" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "200G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "200G" + sysport: "5" + type: "eth" +# Aux ports to be enabled later +# - id: "33" +# fec: "NONE" +# lanes: "0:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "33" +# type: "mgmt 0" +# - id: "34" +# fec: "NONE" +# lanes: "1:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "34" +# type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "00001010" + rx_polarity: "01001001" + lane_swap: "46750132" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "1" + tx_polarity: "00011111" + rx_polarity: "01101001" + lane_swap: "46752130" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "2" + tx_polarity: "00101000" + rx_polarity: "11110111" + lane_swap: "57462301" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "3" + tx_polarity: "00111101" + rx_polarity: "00101101" + lane_swap: "67542301" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "4" + tx_polarity: "01110110" + rx_polarity: "01111101" + lane_swap: "76543021" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "5" + tx_polarity: "00100100" + rx_polarity: "01101010" + lane_swap: "76542103" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "6" + tx_polarity: "11000011" + rx_polarity: "11110101" + lane_swap: "45672013" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "7" + tx_polarity: "10011101" + rx_polarity: "11111010" + lane_swap: "74562103" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "8" + tx_polarity: "01001000" + rx_polarity: "00100011" + lane_swap: "54672301" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "9" + tx_polarity: "11111111" + rx_polarity: "01110111" + lane_swap: "46750321" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "10" + tx_polarity: "10011110" + rx_polarity: "10110000" + lane_swap: "67542310" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "11" + tx_polarity: "01010010" + rx_polarity: "10101011" + lane_swap: "65741302" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "12" + tx_polarity: "11010110" + rx_polarity: "01101001" + lane_swap: "45760321" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "13" + tx_polarity: "01110111" + rx_polarity: "00101000" + lane_swap: "45670123" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "14" + tx_polarity: "11110110" + rx_polarity: "10111100" + lane_swap: "67542013" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "15" + tx_polarity: "01011011" + rx_polarity: "01101000" + lane_swap: "64572103" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + + diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/innovium.55610 b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/innovium.55610 new file mode 100644 index 00000000000..b3b7fab24f9 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/innovium.55610 @@ -0,0 +1,62 @@ +sku: innovium.55610 + +device_id: 0x1b59 + +# Hardware constraint information +hardware: + num_ibs: 2 + ib_active: 0, 1 + + ports_per_ib: 64, 64 + recirc_port_num: 64, 64 + cpu_port_num: 65 + cpu_port_ib: 0 + mgmt_port_num: 65, 66 + mgmt_port_ibs: 1, 1 + + pics_per_ib: 9, 9 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 0 + + isg [0-7]: + ib: 0 + pic_id: [0-7] + + isg 8: + ib: 1 + pic_id: 7 + + isg 9: + ib: 1 + pic_id: 6 + + isg 10: + ib: 1 + pic_id: 5 + + isg 11: + ib: 1 + pic_id: 4 + + isg 12: + ib: 1 + pic_id: 3 + + isg 13: + ib: 1 + pic_id: 2 + + isg 14: + ib: 1 + pic_id: 1 + + isg 15: + ib: 1 + pic_id: 0 + + isg 16: + mode: 0:2 + ib: 1 + pic_id: 8 diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/ivm.sai.config.yaml b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/ivm.sai.config.yaml new file mode 100644 index 00000000000..f1901be9a6c --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x200G_Cameo-escc601-32q.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55610" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "64" diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/ivm.sai.datapath.config.yaml b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..ef4bc6d129c --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/pg_profile_lookup.ini b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/port_config.ini b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/port_config.ini new file mode 100644 index 00000000000..371c04c2635 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/port_config.ini @@ -0,0 +1,33 @@ +# name lanes speed index mtu fec +Ethernet0 121,122,123,124 200000 0 9126 rs +Ethernet4 125,126,127,128 200000 1 9126 rs +Ethernet8 113,114,115,116 200000 2 9126 rs +Ethernet12 117,118,119,120 200000 3 9126 rs +Ethernet16 105,106,107,108 200000 4 9126 rs +Ethernet20 109,110,111,112 200000 5 9126 rs +Ethernet24 97,98,99,100 200000 6 9126 rs +Ethernet28 101,102,103,104 200000 7 9126 rs +Ethernet32 89,90,91,92 200000 8 9126 rs +Ethernet36 93,94,95,96 200000 9 9126 rs +Ethernet40 81,82,83,84 200000 10 9126 rs +Ethernet44 85,86,87,88 200000 11 9126 rs +Ethernet48 73,74,75,76 200000 12 9126 rs +Ethernet52 77,78,79,80 200000 13 9126 rs +Ethernet56 65,66,67,68 200000 14 9126 rs +Ethernet60 69,70,71,72 200000 15 9126 rs +Ethernet64 57,58,59,60 200000 16 9126 rs +Ethernet68 61,62,63,64 200000 17 9126 rs +Ethernet72 49,50,51,52 200000 18 9126 rs +Ethernet76 53,54,55,56 200000 19 9126 rs +Ethernet80 41,42,43,44 200000 20 9126 rs +Ethernet84 45,46,47,48 200000 21 9126 rs +Ethernet88 33,34,35,36 200000 22 9126 rs +Ethernet92 37,38,39,40 200000 23 9126 rs +Ethernet96 25,26,27,28 200000 24 9126 rs +Ethernet100 29,30,31,32 200000 25 9126 rs +Ethernet104 17,18,19,20 200000 26 9126 rs +Ethernet108 21,22,23,24 200000 27 9126 rs +Ethernet112 9,10,11,12 200000 28 9126 rs +Ethernet116 13,14,15,16 200000 29 9126 rs +Ethernet120 1,2,3,4 200000 30 9126 rs +Ethernet124 5,6,7,8 200000 31 9126 rs diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos.json.j2 b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos.json.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos_defaults_def_lossy.j2 new file mode 100644 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos_defaults_t1.j2 b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/sai.profile b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/escc601-32q/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/installer.conf b/device/cameo/x86_64-cameo_escc601_32q-r0/installer.conf new file mode 100644 index 00000000000..925a32fc0c3 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/platform_reboot b/device/cameo/x86_64-cameo_escc601_32q-r0/platform_reboot new file mode 100755 index 00000000000..46ee9f04ac1 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/platform_reboot @@ -0,0 +1,16 @@ +#!/bin/sh + +mr_reboot() { + + sudo rmmod x86-64-cameo-escc601-32q + sudo i2cset -y 0 0x30 0xa1 0 + +} + +if [ $# -eq 0 ] || [ $@ = "-f" ] || [ $@ = "--force" ] || [ $@ = "reboot" ]; then + mr_reboot +elif [ $@ = "-p" ] ; then + sudo halt +else + echo "unsupported option" +fi diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/eeprom.py b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/eeprom.py new file mode 100755 index 00000000000..5b6ed4606b4 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/eeprom.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/led_monitor_plugin.py b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/led_monitor_plugin.py new file mode 100755 index 00000000000..27db265a454 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/led_monitor_plugin.py @@ -0,0 +1,84 @@ +"""SONiC LED plugin to control LED on/off/blinking when link-up/link-down/flowing-traffic +""" +def platform_configure_led(isg, lane, link_status, detailed_speed, activity_status): + """ Configure LED to turn on/off/blink based on link-up/link-down/activity-status + Args: + isg, lane, link_status, detailed_speed, activity_status + Returns: + cmd + Raises: + none + """ + base_cmd = 'i2cset -f -y 0 0x38' + isg_to_bitset_map = { + 'ISG0':'0', + 'ISG1':'1', + 'ISG2':'2', + 'ISG3':'3', + 'ISG4':'4', + 'ISG5':'5', + 'ISG6':'6', + 'ISG7':'7', + 'ISG8':'8', + 'ISG9':'9', + 'ISG10':'a', + 'ISG11':'b', + 'ISG12':'c', + 'ISG13':'d', + 'ISG14':'e', + 'ISG15':'f' + } + detailed_speed_to_bitset_map = { + '400G/50G':'0', + '200G/50G':'1', + '200G/25G':'2', + '100G/50G':'3', + '50G/50G':'4', + '100G/25G':'5', + '50G/25G':'6', + '25G/25G':'7', + '40G/10G':'8', + '10G/10G':'9' + } + + try: + if link_status == 'D': + arg = '0x' + isg_to_bitset_map[isg] + str(lane) + cmd = base_cmd + ' ' + arg + ' 0x00' + elif link_status == 'U': + arg1 = '0x' + isg_to_bitset_map[isg] + str(lane) + arg2 = '0x' + str(1+(2*activity_status)) + detailed_speed_to_bitset_map[detailed_speed] + cmd = base_cmd + ' ' + arg1 + ' ' + arg2 + + return cmd + + except Exception: + print('Error when processing command: {}'.format(cmd)) + raise + +def platform_configure_switch_led_control_from_TL5_to_CPU(): + """ Configure switch LED stream from TL5 to CPU through i2c + Args: + none + Returns: + cmd + Raises: + none + """ + cmd = 'i2cset -f -y 0 0x30 0xa0 0xf' + return cmd + +def main(): + """ Main function. + Args: + none + Returns: + none + Raises: + none + """ + return + + +if __name__ == '__main__': + main() diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/psuutil.py b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/psuutil.py new file mode 100755 index 00000000000..39566d208bc --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/psuutil.py @@ -0,0 +1,95 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/ESCC601_POWER/' + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + + # Get sysfs attribute + def get_attr_value(self, path): + + retval = 'ERR' + if (not os.path.isfile(path)): + return retval + + try: + with open(path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", path, " file !") + + retval = retval.rstrip('\r\n') + return retval + + 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 + """ + MAX_PSUS = 2 + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 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 + """ + status = 0 + attr_file = 'psu{}_good'.format(index) + status_path = attr_path + attr_file + try: + reg_file = open(status_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 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 = 0 + attr_file ='psu{}_prnt'.format(index) + presence_path = attr_path + attr_file + try: + reg_file = open(presence_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/sfputil.py b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/sfputil.py new file mode 100755 index 00000000000..899b127960e --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/plugins/sfputil.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python + +try: + import time + import json + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/' +PLATFORM_INSTALL_INFO_FILE="/etc/sonic/platform_install.json" +PLATFORM_SFP_GROUPS = ['SFP-G01','SFP-G02','SFP-G03','SFP-G04'] + +QSFP_RESET_FILE = 'ESCC601_QSFP/qsfp{}_reset' +QSFP_LOWPOWER_FILE = 'ESCC601_QSFP/qsfp{}_low_power' +QSFP_PRESENT_FILE = 'ESCC601_QSFP/qsfp{}_present' + +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" + + _port_start = 0 + _port_end = 31 + _port_in_block =32 + _port_to_eeprom_mapping = {} + _global_port_pres_dict = {} + + def __init__(self): + eeprom_path = "{}/eeprom" + path_list = self.get_sfp_path() + for x in range(self._port_start, self._port_end + 1): + port_eeprom_path = eeprom_path.format(path_list[x]) + self._port_to_eeprom_mapping[x] = port_eeprom_path + + self.init_global_port_presence() + SfpUtilBase.__init__(self) + + def get_sfp_path(self): + map = [] + with open(PLATFORM_INSTALL_INFO_FILE) as fd: + install_info = json.load(fd) + for sfp_group_name in PLATFORM_SFP_GROUPS: + sfp_group = install_info[2][sfp_group_name] + map = map + sfp_group['paths'] + return map + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + path = attr_path+QSFP_RESET_FILE.format(port_num+1) + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + reg_file.seek(0) + reg_file.write('1') + + reg_file.close() + 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 + + path = attr_path+QSFP_LOWPOWER_FILE.format(port_num+1) + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + # the gpio pin is ACTIVE_HIGH + if lpmode is True: + val = "1" + else: + val = "0" + + # write value to gpio + reg_file.seek(0) + reg_file.write(val) + reg_file.close() + + return True + + 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 + + path = attr_path+QSFP_LOWPOWER_FILE.format(port_num+1) + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + text = reg_file.read() + reg_file.close() + if int(text) == 1: + return True + + return False + + 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 + + path = attr_path+QSFP_PRESENT_FILE.format(port_num+1) + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + reg_file.close() + if int(text) == 1: + return True + + return False + + 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 get_transceiver_change_event(self, timeout=0): + 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(1) + + @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(0, self._port_in_block + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/pmon_daemon_control.json b/device/cameo/x86_64-cameo_escc601_32q-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/sensors.conf b/device/cameo/x86_64-cameo_escc601_32q-r0/sensors.conf new file mode 100644 index 00000000000..b28b04f6431 --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/sensors.conf @@ -0,0 +1,3 @@ + + + diff --git a/device/cameo/x86_64-cameo_escc601_32q-r0/topo.conf b/device/cameo/x86_64-cameo_escc601_32q-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/cameo/x86_64-cameo_escc601_32q-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/default_sku b/device/cameo/x86_64-cameo_esqc610_56sq-r0/default_sku new file mode 100644 index 00000000000..b07f8e4ed9a --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/default_sku @@ -0,0 +1 @@ +esqc610-56sq t1 diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers.json.j2 b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers.json.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..72a618f07f4 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers_defaults_t1.j2 b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/config_48x25G_8x100G_Cameo-esqc610-56sq.yaml b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/config_48x25G_8x100G_Cameo-esqc610-56sq.yaml new file mode 100644 index 00000000000..1a8f583364e --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/config_48x25G_8x100G_Cameo-esqc610-56sq.yaml @@ -0,0 +1,563 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.55200" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + skip_pll_check: "false" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + mac_clk: "750" + sys_clk: "975" + ifc_clk: "525" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + devports: + - id: "0" + sysport: "129" + type: "cpu" + - id: "113" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "113" + type: "eth" + - id: "114" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "114" + type: "eth" + - id: "115" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "115" + type: "eth" + - id: "116" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "116" + type: "eth" + - id: "117" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "14" + speed: "25G" + sysport: "117" + type: "eth" + - id: "105" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "105" + type: "eth" + - id: "106" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "106" + type: "eth" + - id: "107" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "107" + type: "eth" + - id: "108" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "108" + type: "eth" + - id: "109" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "13" + speed: "25G" + sysport: "109" + type: "eth" + - id: "110" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "13" + speed: "25G" + sysport: "110" + type: "eth" + - id: "111" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "13" + speed: "25G" + sysport: "111" + type: "eth" + - id: "112" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "13" + speed: "25G" + sysport: "112" + type: "eth" + - id: "89" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "89" + type: "eth" + - id: "90" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "90" + type: "eth" + - id: "91" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "91" + type: "eth" + - id: "92" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "92" + type: "eth" + - id: "93" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "11" + speed: "25G" + sysport: "93" + type: "eth" + - id: "94" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "11" + speed: "25G" + sysport: "94" + type: "eth" + - id: "95" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "11" + speed: "25G" + sysport: "95" + type: "eth" + - id: "96" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "11" + speed: "25G" + sysport: "96" + type: "eth" + - id: "118" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "14" + speed: "25G" + sysport: "118" + type: "eth" + - id: "119" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "14" + speed: "25G" + sysport: "119" + type: "eth" + - id: "120" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "14" + speed: "25G" + sysport: "120" + type: "eth" + - id: "41" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "41" + type: "eth" + - id: "42" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "42" + type: "eth" + - id: "43" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "43" + type: "eth" + - id: "44" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "44" + type: "eth" + - id: "45" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "5" + speed: "25G" + sysport: "45" + type: "eth" + - id: "46" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "5" + speed: "25G" + sysport: "46" + type: "eth" + - id: "47" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "5" + speed: "25G" + sysport: "47" + type: "eth" + - id: "48" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "5" + speed: "25G" + sysport: "48" + type: "eth" + - id: "25" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "3" + speed: "25G" + sysport: "25" + type: "eth" + - id: "26" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "3" + speed: "25G" + sysport: "26" + type: "eth" + - id: "27" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "3" + speed: "25G" + sysport: "27" + type: "eth" + - id: "28" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "3" + speed: "25G" + sysport: "28" + type: "eth" + - id: "29" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "3" + speed: "25G" + sysport: "29" + type: "eth" + - id: "30" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "3" + speed: "25G" + sysport: "30" + type: "eth" + - id: "31" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "3" + speed: "25G" + sysport: "31" + type: "eth" + - id: "32" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "3" + speed: "25G" + sysport: "32" + type: "eth" + - id: "17" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "2" + speed: "25G" + sysport: "17" + type: "eth" + - id: "18" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "2" + speed: "25G" + sysport: "18" + type: "eth" + - id: "19" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "2" + speed: "25G" + sysport: "19" + type: "eth" + - id: "20" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "2" + speed: "25G" + sysport: "20" + type: "eth" + - id: "21" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "2" + speed: "25G" + sysport: "21" + type: "eth" + - id: "22" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "2" + speed: "25G" + sysport: "22" + type: "eth" + - id: "23" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "2" + speed: "25G" + sysport: "23" + type: "eth" + - id: "24" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "2" + speed: "25G" + sysport: "24" + type: "eth" + - id: "73" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - id: "77" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - id: "65" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - id: "69" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - id: "9" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - id: "13" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - id: "1" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - id: "5" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" +# Aux ports to be enabled later +# - id: "33" +# fec: "NONE" +# lanes: "0:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "33" +# type: "mgmt 0" +# - id: "34" +# fec: "NONE" +# lanes: "1:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "34" +# type: "mgmt 1" + isg: + - id: "0" + lane_swap: "10325674" + rx_polarity: "00000110" + tx_polarity: "00010001" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "1" + lane_swap: "12305476" + rx_polarity: "01111110" + tx_polarity: "10111101" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "2" + lane_swap: "20416375" + rx_polarity: "00101011" + tx_polarity: "01100011" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "3" + lane_swap: "01234576" + rx_polarity: "01010111" + tx_polarity: "10001110" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "4" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "5" + lane_swap: "13250467" + rx_polarity: "10100110" + tx_polarity: "10101001" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "6" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "7" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "8" + lane_swap: "03214576" + rx_polarity: "01110010" + tx_polarity: "01101010" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "9" + lane_swap: "30217456" + rx_polarity: "00000111" + tx_polarity: "01010001" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "11" + lane_swap: "76543201" + rx_polarity: "10010100" + tx_polarity: "11010010" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "12" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "13" + lane_swap: "75614320" + rx_polarity: "01101111" + tx_polarity: "11010111" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "14" + lane_swap: "52476013" + rx_polarity: "01011011" + tx_polarity: "00011000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "15" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/innovium.55200 b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/innovium.55200 new file mode 100644 index 00000000000..1ceb2ed4a5e --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/innovium.55200 @@ -0,0 +1,62 @@ +sku: innovium.55200 + +device_id: 0x1b59 + +# Hardware constraint information +hardware: + num_ibs: 2 + ib_active: 0, 1 + + ports_per_ib: 64, 64 + recirc_port_num: 64, 64 + cpu_port_num: 65 + cpu_port_ib: 0 + mgmt_port_num: 65, 66 + mgmt_port_ibs: 1, 1 + + pics_per_ib: 9, 9 + pic_ports_per_pic: 8 + max_serdes_speed: 25 + + num_shared_pics: 0 + + isg [0-7]: + ib: 0 + pic_id: [0-7] + + isg 8: + ib: 1 + pic_id: 7 + + isg 9: + ib: 1 + pic_id: 6 + + isg 10: + ib: 1 + pic_id: 5 + + isg 11: + ib: 1 + pic_id: 4 + + isg 12: + ib: 1 + pic_id: 3 + + isg 13: + ib: 1 + pic_id: 2 + + isg 14: + ib: 1 + pic_id: 1 + + isg 15: + ib: 1 + pic_id: 0 + + isg 16: + mode: 0:2 + ib: 1 + pic_id: 8 diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/ivm.sai.config.yaml b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/ivm.sai.config.yaml new file mode 100644 index 00000000000..5ee2bbc89b6 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_48x25G_8x100G_Cameo-esqc610-56sq.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55200" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "64" diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/ivm.sai.datapath.config.yaml b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..ef4bc6d129c --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/pg_profile_lookup.ini b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/port_config.ini b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/port_config.ini new file mode 100644 index 00000000000..cd7fc50924d --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/port_config.ini @@ -0,0 +1,57 @@ +# name lanes speed index mtu fec +Ethernet0 113 25000 0 9126 rs +Ethernet1 114 25000 1 9126 rs +Ethernet2 115 25000 2 9126 rs +Ethernet3 116 25000 3 9126 rs +Ethernet4 117 25000 4 9126 rs +Ethernet5 105 25000 5 9126 rs +Ethernet6 106 25000 6 9126 rs +Ethernet7 107 25000 7 9126 rs +Ethernet8 108 25000 8 9126 rs +Ethernet9 109 25000 9 9126 rs +Ethernet10 110 25000 10 9126 rs +Ethernet11 111 25000 11 9126 rs +Ethernet12 112 25000 12 9126 rs +Ethernet13 89 25000 13 9126 rs +Ethernet14 90 25000 14 9126 rs +Ethernet15 91 25000 15 9126 rs +Ethernet16 92 25000 16 9126 rs +Ethernet17 93 25000 17 9126 rs +Ethernet18 94 25000 18 9126 rs +Ethernet19 95 25000 19 9126 rs +Ethernet20 96 25000 20 9126 rs +Ethernet21 118 25000 21 9126 rs +Ethernet22 119 25000 22 9126 rs +Ethernet23 120 25000 23 9126 rs +Ethernet24 41 25000 24 9126 rs +Ethernet25 42 25000 25 9126 rs +Ethernet26 43 25000 26 9126 rs +Ethernet27 44 25000 27 9126 rs +Ethernet28 45 25000 28 9126 rs +Ethernet29 46 25000 29 9126 rs +Ethernet30 47 25000 30 9126 rs +Ethernet31 48 25000 31 9126 rs +Ethernet32 25 25000 32 9126 rs +Ethernet33 26 25000 33 9126 rs +Ethernet34 27 25000 34 9126 rs +Ethernet35 28 25000 35 9126 rs +Ethernet36 29 25000 36 9126 rs +Ethernet37 30 25000 37 9126 rs +Ethernet38 31 25000 38 9126 rs +Ethernet39 32 25000 39 9126 rs +Ethernet40 17 25000 40 9126 rs +Ethernet41 18 25000 41 9126 rs +Ethernet42 19 25000 42 9126 rs +Ethernet43 20 25000 43 9126 rs +Ethernet44 21 25000 44 9126 rs +Ethernet45 22 25000 45 9126 rs +Ethernet46 23 25000 46 9126 rs +Ethernet47 24 25000 47 9126 rs +Ethernet48 73,74,75,76 100000 48 9126 rs +Ethernet52 77,78,79,80 100000 49 9126 rs +Ethernet56 65,66,67,68 100000 50 9126 rs +Ethernet60 69,70,71,72 100000 51 9126 rs +Ethernet64 9,10,11,12 100000 52 9126 rs +Ethernet68 13,14,15,16 100000 53 9126 rs +Ethernet72 1,2,3,4 100000 54 9126 rs +Ethernet76 5,6,7,8 100000 55 9126 rs diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos.json.j2 b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos.json.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos_defaults_def_lossy.j2 b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos_defaults_def_lossy.j2 new file mode 100644 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos_defaults_t1.j2 b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/sai.profile b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/esqc610-56sq/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/installer.conf b/device/cameo/x86_64-cameo_esqc610_56sq-r0/installer.conf new file mode 100644 index 00000000000..6375612d6cb --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 \ No newline at end of file diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/platform_reboot b/device/cameo/x86_64-cameo_esqc610_56sq-r0/platform_reboot new file mode 100755 index 00000000000..0d45ca026b7 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/platform_reboot @@ -0,0 +1,16 @@ +#!/bin/sh + +mr_reboot() { + + sudo rmmod x86-64-cameo-esqc610-56sq + sudo i2cset -y 0 0x30 0xa1 0 + +} + +if [ $# -eq 0 ] || [ $@ = "-f" ] || [ $@ = "--force" ] || [ $@ = "reboot" ]; then + mr_reboot +elif [ $@ = "-p" ] ; then + sudo halt +else + echo "unsupported option" +fi diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/eeprom.py b/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/eeprom.py new file mode 100755 index 00000000000..5b6ed4606b4 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/eeprom.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/psuutil.py b/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/psuutil.py new file mode 100755 index 00000000000..f0b135d4a41 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/psuutil.py @@ -0,0 +1,95 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/ESQC610_POWER/' + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + + # Get sysfs attribute + def get_attr_value(self, path): + + retval = 'ERR' + if (not os.path.isfile(path)): + return retval + + try: + with open(path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", path, " file !") + + retval = retval.rstrip('\r\n') + return retval + + 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 + """ + MAX_PSUS = 2 + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 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 + """ + status = 0 + attr_file = 'psu{}_good'.format(index) + status_path = attr_path + attr_file + try: + reg_file = open(status_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 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 = 0 + attr_file ='psu{}_prnt'.format(index) + presence_path = attr_path + attr_file + try: + reg_file = open(presence_path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + + if int(text) == 1: + status = 1 + + reg_file.close() + + return status + diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/sfputil.py b/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/sfputil.py new file mode 100755 index 00000000000..0ac1f5c8703 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/plugins/sfputil.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python + +try: + import time + import json + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +attr_path = '/sys/class/hwmon/hwmon2/device/' +PLATFORM_INSTALL_INFO_FILE="/etc/sonic/platform_install.json" +PLATFORM_SFP_GROUPS = ['SFP-G01','SFP-G02','SFP-G03','SFP-G04','SFP-G05', 'SFP-G06', 'SFP-G07'] + +QSFP_RESET_FILE = 'ESQC610_QSFP/qsfp{}_reset' +QSFP_LOWPOWER_FILE = 'ESQC610_QSFP/qsfp{}_low_power' +QSFP_PRESENT_FILE = 'ESQC610_QSFP/qsfp{}_present' + +SFP_PRESENT_FILE = 'ESQC610_SFP/sfp{}_present' + +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" + + _port_start = 0 + _port_end = 55 + _qsfp_port_start = 48 + _port_in_block =56 + _port_to_eeprom_mapping = {} + _global_port_pres_dict = {} + + def __init__(self): + eeprom_path = "{}/eeprom" + path_list = self.get_sfp_path() + for x in range(self._port_start, self._port_end + 1): + port_eeprom_path = eeprom_path.format(path_list[x]) + self._port_to_eeprom_mapping[x] = port_eeprom_path + + self.init_global_port_presence() + SfpUtilBase.__init__(self) + + def get_sfp_path(self): + map = [] + with open(PLATFORM_INSTALL_INFO_FILE) as fd: + install_info = json.load(fd) + for sfp_group_name in PLATFORM_SFP_GROUPS: + sfp_group = install_info[2][sfp_group_name] + map = map + sfp_group['paths'] + return map + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self._qsfp_port_start or port_num > self._port_end: + return False + + path = attr_path+QSFP_RESET_FILE.format(port_num-self._qsfp_port_start+1) + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + reg_file.seek(0) + reg_file.write('1') + + reg_file.close() + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self._qsfp_port_start or port_num > self._port_end: + return False + + path = attr_path+QSFP_LOWPOWER_FILE.format(port_num-self._qsfp_port_start+1) + try: + reg_file = open(path, 'w') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + # the gpio pin is ACTIVE_HIGH + if lpmode is True: + val = "1" + else: + val = "0" + + # write value to gpio + reg_file.seek(0) + reg_file.write(val) + reg_file.close() + + return True + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self._qsfp_port_start or port_num > self._port_end: + return False + + path = attr_path+QSFP_LOWPOWER_FILE.format(port_num-self._qsfp_port_start+1) + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + + text = reg_file.read() + reg_file.close() + if int(text) == 1: + return True + + return False + + 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 + + if port_num >= self._qsfp_port_start: + path = attr_path+QSFP_PRESENT_FILE.format(port_num-self._qsfp_port_start+1) + else: + path = attr_path+SFP_PRESENT_FILE.format(port_num+1) + + try: + reg_file = open(path, 'r') + except IOError as e: + print( "Error: unable to open file: %s" % str(e)) + return False + text = reg_file.read() + reg_file.close() + if int(text) == 1: + return True + + return False + + 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 get_transceiver_change_event(self, timeout=0): + 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(1) + + @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._qsfp_port_start, self._port_end + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/pmon_daemon_control.json b/device/cameo/x86_64-cameo_esqc610_56sq-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/sensors.conf b/device/cameo/x86_64-cameo_esqc610_56sq-r0/sensors.conf new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/sensors.conf @@ -0,0 +1 @@ + diff --git a/device/cameo/x86_64-cameo_esqc610_56sq-r0/topo.conf b/device/cameo/x86_64-cameo_esqc610_56sq-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/cameo/x86_64-cameo_esqc610_56sq-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai.profile b/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai.profile index f467f997fe6..a98bdc993e7 100644 --- a/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai.profile +++ b/device/celestica/x86_64-cel_e1031-r0/Celestica-E1031-T48S4/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/helix4-e1031-48x1G+4x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py index 6ef8838ba8a..5932b30c326 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py @@ -11,7 +11,6 @@ import os import time import subprocess -import sonic_device_util from ctypes import create_string_buffer try: @@ -105,7 +104,7 @@ def __init__(self, sfp_index): self.port_to_eeprom_mapping[x] = eeprom_path.format( self.port_to_i2c_mapping[x]) - self.info_dict_keys = ['type', 'hardwarerev', 'serialnum', 'manufacturename', 'modelname', 'Connector', 'encoding', 'ext_identifier', + self.info_dict_keys = ['type', 'hardware_rev', 'serial', 'manufacturer', 'model', 'connector', 'encoding', 'ext_identifier', 'ext_rateselect_compliance', 'cable_type', 'cable_length', 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui'] self.dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', 'power_lpmode', 'tx_disable', 'tx_disable_channel', 'temperature', 'voltage', @@ -185,11 +184,11 @@ def get_transceiver_info(self): keys |Value Format |Information ---------------------------|---------------|---------------------------- type |1*255VCHAR |type of SFP - hardwarerev |1*255VCHAR |hardware version of SFP - serialnum |1*255VCHAR |serial number of the SFP - manufacturename |1*255VCHAR |SFP vendor name - modelname |1*255VCHAR |SFP model name - Connector |1*255VCHAR |connector information + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information encoding |1*255VCHAR |encoding information ext_identifier |1*255VCHAR |extend identifier ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance @@ -248,17 +247,17 @@ def get_transceiver_info(self): if sfp_interface_bulk_data: transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] - transceiver_info_dict['Connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data[ + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data[ 'data']['Vendor Name']['value'] if sfp_vendor_name_data else 'N/A' - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] if sfp_vendor_oui_data else 'N/A' transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' @@ -705,7 +704,7 @@ def get_model(self): string: Model/part number of device """ transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("modelname", "N/A") + return transceiver_dom_info_dict.get("model", "N/A") def get_serial(self): """ @@ -714,4 +713,4 @@ def get_serial(self): string: Serial number of device """ transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("serialnum", "N/A") + return transceiver_dom_info_dict.get("serial", "N/A") diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers.json.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/config_64x100G_midstone100x.yaml b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/config_64x100G_midstone100x.yaml new file mode 100644 index 00000000000..77a0eb6c263 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/config_64x100G_midstone100x.yaml @@ -0,0 +1,642 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77500" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + - fec: "KRFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + - fec: "KRFEC" + id: "205" + lanes: "4:4" + serdes_group: "25" + speed: "100G" + sysport: "205" + type: "eth" + - fec: "KRFEC" + id: "197" + lanes: "4:4" + serdes_group: "24" + speed: "100G" + sysport: "197" + type: "eth" + - fec: "KRFEC" + id: "189" + lanes: "4:4" + serdes_group: "23" + speed: "100G" + sysport: "189" + type: "eth" + - fec: "KRFEC" + id: "181" + lanes: "4:4" + serdes_group: "22" + speed: "100G" + sysport: "181" + type: "eth" + - fec: "KRFEC" + id: "173" + lanes: "4:4" + serdes_group: "21" + speed: "100G" + sysport: "173" + type: "eth" + - fec: "KRFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + - fec: "KRFEC" + id: "253" + lanes: "4:4" + serdes_group: "31" + speed: "100G" + sysport: "253" + type: "eth" + - fec: "KRFEC" + id: "245" + lanes: "4:4" + serdes_group: "30" + speed: "100G" + sysport: "245" + type: "eth" + - fec: "KRFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + - fec: "KRFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + - fec: "KRFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + - fec: "KRFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + - fec: "KRFEC" + id: "141" + lanes: "4:4" + serdes_group: "17" + speed: "100G" + sysport: "141" + type: "eth" + - fec: "KRFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + - fec: "KRFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KRFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KRFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KRFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KRFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KRFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KRFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" + - fec: "KRFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - fec: "KRFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - fec: "KRFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KRFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - fec: "KRFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - fec: "KRFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + - fec: "KRFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + - fec: "KRFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KRFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + isg: + - id: "0" + lane_swap: "02317654" + tx_polarity: "11011000" + rx_polarity: "01101010" + - id: "1" + lane_swap: "20134567" + tx_polarity: "00001010" + rx_polarity: "00110100" + - id: "2" + lane_swap: "02137465" + tx_polarity: "00010010" + rx_polarity: "10110000" + - id: "3" + lane_swap: "12036475" + tx_polarity: "11100111" + rx_polarity: "10000001" + - id: "4" + lane_swap: "01237465" + tx_polarity: "00101101" + rx_polarity: "00111110" + - id: "5" + lane_swap: "12304675" + tx_polarity: "10001011" + rx_polarity: "01010110" + - id: "6" + lane_swap: "01237654" + tx_polarity: "00100110" + rx_polarity: "00011101" + - id: "7" + lane_swap: "12037456" + tx_polarity: "00101000" + rx_polarity: "00001111" + - id: "8" + lane_swap: "01237654" + tx_polarity: "10110110" + rx_polarity: "01011011" + - id: "9" + lane_swap: "12035467" + tx_polarity: "11101000" + rx_polarity: "00011001" + - id: "10" + lane_swap: "01235674" + tx_polarity: "01111111" + rx_polarity: "01011011" + - id: "11" + lane_swap: "01237564" + tx_polarity: "01101100" + rx_polarity: "11011000" + - id: "12" + lane_swap: "01237546" + tx_polarity: "00011101" + rx_polarity: "00000010" + - id: "13" + lane_swap: "03216475" + tx_polarity: "10000011" + rx_polarity: "11011111" + - id: "14" + lane_swap: "01237564" + tx_polarity: "00111011" + rx_polarity: "00000011" + - id: "15" + lane_swap: "03214567" + tx_polarity: "00000101" + rx_polarity: "01000111" + - id: "16" + lane_swap: "12034576" + tx_polarity: "00010100" + rx_polarity: "10000001" + - id: "17" + lane_swap: "02314567" + tx_polarity: "00100111" + rx_polarity: "00100000" + - id: "18" + lane_swap: "01234576" + tx_polarity: "00011101" + rx_polarity: "11100111" + - id: "19" + lane_swap: "13204567" + tx_polarity: "00011101" + rx_polarity: "00111001" + - id: "20" + lane_swap: "01237564" + tx_polarity: "00000111" + rx_polarity: "10010101" + - id: "21" + lane_swap: "01235647" + tx_polarity: "00111011" + rx_polarity: "00111101" + - id: "22" + lane_swap: "12307564" + tx_polarity: "11110100" + rx_polarity: "01010001" + - id: "23" + lane_swap: "03214657" + tx_polarity: "00111000" + rx_polarity: "10000111" + - id: "24" + lane_swap: "01236547" + tx_polarity: "00010111" + rx_polarity: "11001101" + - id: "25" + lane_swap: "01235647" + tx_polarity: "00101011" + rx_polarity: "01111110" + - id: "26" + lane_swap: "01234567" + tx_polarity: "00010101" + rx_polarity: "11000100" + - id: "27" + lane_swap: "01234567" + tx_polarity: "00100000" + rx_polarity: "00111110" + - id: "28" + lane_swap: "01236754" + tx_polarity: "10101001" + rx_polarity: "11011001" + - id: "29" + lane_swap: "01234567" + tx_polarity: "00101010" + rx_polarity: "10011111" + - id: "30" + lane_swap: "31204567" + tx_polarity: "00010101" + rx_polarity: "01101110" + - id: "31" + lane_swap: "01234567" + tx_polarity: "00100011" + rx_polarity: "11001110" + - id: "32" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00000000" diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/innovium.77500 b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/innovium.77500 new file mode 100644 index 00000000000..89762aa8d51 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/innovium.77500 @@ -0,0 +1,59 @@ +sku: innovium.77500 + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 25 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/innovium.77700_B b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/ivm.sai.config.yaml b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/ivm.sai.config.yaml new file mode 100644 index 00000000000..4fdce12139b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_midstone100x.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77500" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/pg_profile_lookup.ini b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/port_config.ini b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/port_config.ini new file mode 100644 index 00000000000..8d5edab00fa --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias speed index mtu fec +Ethernet0 221,222,223,224 Eth1 100000 0 9126 rs +Ethernet4 213,214,215,216 Eth2 100000 1 9126 rs +Ethernet8 205,206,207,208 Eth3 100000 2 9126 rs +Ethernet12 197,198,199,200 Eth4 100000 3 9126 rs +Ethernet16 189,190,191,192 Eth5 100000 4 9126 rs +Ethernet20 181,182,183,184 Eth6 100000 5 9126 rs +Ethernet24 173,174,175,176 Eth7 100000 6 9126 rs +Ethernet28 165,166,167,168 Eth8 100000 7 9126 rs +Ethernet32 253,254,255,256 Eth9 100000 8 9126 rs +Ethernet36 245,246,247,248 Eth10 100000 9 9126 rs +Ethernet40 237,238,239,240 Eth11 100000 10 9126 rs +Ethernet44 229,230,231,232 Eth12 100000 11 9126 rs +Ethernet48 157,158,159,160 Eth13 100000 12 9126 rs +Ethernet52 149,150,151,152 Eth14 100000 13 9126 rs +Ethernet56 141,142,143,144 Eth15 100000 14 9126 rs +Ethernet60 133,134,135,136 Eth16 100000 15 9126 rs +Ethernet64 117,118,119,120 Eth17 100000 16 9126 rs +Ethernet68 125,126,127,128 Eth18 100000 17 9126 rs +Ethernet72 101,102,103,104 Eth19 100000 18 9126 rs +Ethernet76 109,110,111,112 Eth20 100000 19 9126 rs +Ethernet80 21,22,23,24 Eth21 100000 20 9126 rs +Ethernet84 29,30,31,32 Eth22 100000 21 9126 rs +Ethernet88 5,6,7,8 Eth23 100000 22 9126 rs +Ethernet92 13,14,15,16 Eth24 100000 23 9126 rs +Ethernet96 85,86,87,88 Eth25 100000 24 9126 rs +Ethernet100 93,94,95,96 Eth26 100000 25 9126 rs +Ethernet104 69,70,71,72 Eth27 100000 26 9126 rs +Ethernet108 77,78,79,80 Eth28 100000 27 9126 rs +Ethernet112 53,54,55,56 Eth29 100000 28 9126 rs +Ethernet116 61,62,63,64 Eth30 100000 29 9126 rs +Ethernet120 37,38,39,40 Eth31 100000 30 9126 rs +Ethernet124 45,46,47,48 Eth32 100000 31 9126 rs +Ethernet128 209,210,211,212 Eth33 100000 32 9126 rs +Ethernet132 217,218,219,220 Eth34 100000 33 9126 rs +Ethernet136 193,194,195,196 Eth35 100000 34 9126 rs +Ethernet140 201,202,203,204 Eth36 100000 35 9126 rs +Ethernet144 177,178,179,180 Eth37 100000 36 9126 rs +Ethernet148 185,186,187,188 Eth38 100000 37 9126 rs +Ethernet152 161,162,163,164 Eth39 100000 38 9126 rs +Ethernet156 169,170,171,172 Eth40 100000 39 9126 rs +Ethernet160 241,242,243,244 Eth41 100000 40 9126 rs +Ethernet164 249,250,251,252 Eth42 100000 41 9126 rs +Ethernet168 225,226,227,228 Eth43 100000 42 9126 rs +Ethernet172 233,234,235,236 Eth44 100000 43 9126 rs +Ethernet176 145,146,147,148 Eth45 100000 44 9126 rs +Ethernet180 153,154,155,156 Eth46 100000 45 9126 rs +Ethernet184 129,130,131,132 Eth47 100000 46 9126 rs +Ethernet188 137,138,139,140 Eth48 100000 47 9126 rs +Ethernet192 121,122,123,124 Eth49 100000 48 9126 rs +Ethernet196 113,114,115,116 Eth50 100000 49 9126 rs +Ethernet200 105,106,107,108 Eth51 100000 50 9126 rs +Ethernet204 97,98,99,100 Eth52 100000 51 9126 rs +Ethernet208 25,26,27,28 Eth53 100000 52 9126 rs +Ethernet212 17,18,19,20 Eth54 100000 53 9126 rs +Ethernet216 9,10,11,12 Eth55 100000 54 9126 rs +Ethernet220 1,2,3,4 Eth56 100000 55 9126 rs +Ethernet224 89,90,91,92 Eth57 100000 56 9126 rs +Ethernet228 81,82,83,84 Eth58 100000 57 9126 rs +Ethernet232 73,74,75,76 Eth59 100000 58 9126 rs +Ethernet236 65,66,67,68 Eth60 100000 59 9126 rs +Ethernet240 57,58,59,60 Eth61 100000 60 9126 rs +Ethernet244 49,50,51,52 Eth62 100000 61 9126 rs +Ethernet248 41,42,43,44 Eth63 100000 62 9126 rs +Ethernet252 33,34,35,36 Eth64 100000 63 9126 rs diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos.json.j2 b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos.json.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos_defaults_def_lossy.j2 new file mode 100644 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/sai.profile b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/Midstone-100x/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/default_sku b/device/celestica/x86_64-cel_midstone-100x-r0/default_sku new file mode 100644 index 00000000000..09bbb49165c --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/default_sku @@ -0,0 +1 @@ +Midstone-100x t1 diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/installer.conf b/device/celestica/x86_64-cel_midstone-100x-r0/installer.conf new file mode 100644 index 00000000000..5e62742c11b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/installer.conf @@ -0,0 +1 @@ +CONSOLE_SPEED=115200 diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/platform_components.json b/device/celestica/x86_64-cel_midstone-100x-r0/platform_components.json new file mode 100644 index 00000000000..4646e75abb5 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/platform_components.json @@ -0,0 +1,19 @@ +{ + "chassis": { + "Midstone-100x": { + "component": { + "FPGA": {}, + "SYSCPLD": {}, + "SWCPLD1": {}, + "SWCPLD2": {}, + "SWCPLD3": {}, + "SWCPLD4": {}, + "Main_BIOS": {}, + "Backup_BIOS": {}, + "Main_BMC": {}, + "Backup_BMC": {}, + "COMeCPLD": {} + } + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/plugins/eeprom.py b/device/celestica/x86_64-cel_midstone-100x-r0/plugins/eeprom.py new file mode 100644 index 00000000000..84bd13d312a --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/plugins/eeprom.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica Silverstone-x +# +# 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: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, 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 = "/sys/class/i2c-adapter/i2c-0/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/plugins/psuutil.py b/device/celestica/x86_64-cel_midstone-100x-r0/plugins/psuutil.py new file mode 100644 index 00000000000..d3393e10dbc --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/plugins/psuutil.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +import subprocess +import sys +import re + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + self.ipmi_raw = "docker exec -ti pmon ipmitool raw 0x4 0x2d" + self.psu1_id = "0x29" + self.psu2_id = "0x33" + PsuBase.__init__(self) + + def run_command(self, command): + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + (out, err) = proc.communicate() + + if proc.returncode != 0: + sys.exit(proc.returncode) + + return out + + def find_value(self, in_string): + result = re.search("^.+ ([0-9a-f]{2}) .+$", in_string) + if result: + return result.group(1) + else: + return result + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + psu_id = self.psu1_id if index == 1 else self.psu2_id + res_string = self.run_command(self.ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + failure_detected = (int(status_byte, 16) >> 1) & 1 + input_lost = (int(status_byte, 16) >> 3) & 1 + if failure_detected or input_lost: + return False + else: + return True + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + psu_id = self.psu1_id if index == 1 else self.psu2_id + res_string = self.run_command(self.ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + presence = ( int(status_byte, 16) >> 0 ) & 1 + if presence: + return True + else: + return False diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/plugins/sfputil.py b/device/celestica/x86_64-cel_midstone-100x-r0/plugins/sfputil.py new file mode 100644 index 00000000000..f05da3f3b01 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/plugins/sfputil.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python +# +# Platform-specific SFP transceiver interface for SONiC +# This plugin supports QSFP-DD, QSFP and SFP. + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 65 + QSFP_PORT_START = 0 + QSFP_PORT_END = 63 + SFP_PORT_START = 64 + SFP_PORT_END = 65 + + EEPROM_OFFSET = 16 + QSFP_PORT_INFO_PATH = '/sys/class/SFF' + SFP_PORT_INFO_PATH = '/sys/bus/platform/devices/cls-xcvr' + PORT_INFO_PATH = QSFP_PORT_INFO_PATH + + _port_name = "" + _port_to_eeprom_mapping = {} + _port_to_i2cbus_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return [] + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.QSFP_PORT_END + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def port_to_i2cbus_mapping(self): + return self._port_to_i2cbus_mapping + + def get_port_name(self, port_num): + if port_num in self.qsfp_ports: + self._port_name = "QSFP" + str(port_num - self.QSFP_PORT_START + 1) + else: + self._port_name = "SFP" + str(port_num - self.SFP_PORT_START + 1) + return self._port_name + + def get_eeprom_dom_raw(self, port_num): + if port_num in self.qsfp_ports: + # QSFP DOM EEPROM is also at addr 0x50 and thus also stored in eeprom_ifraw + return None + else: + # Read dom eeprom at addr 0x51 + return self._read_eeprom_devid(port_num, self.DOM_EEPROM_ADDR, 256) + + def __init__(self): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + + for x in range(self.QSFP_PORT_START, self.QSFP_PORT_END+1): + self.port_to_i2cbus_mapping[x] = (x + self.EEPROM_OFFSET) + self.port_to_eeprom_mapping[x] = eeprom_path.format( + x + self.EEPROM_OFFSET) + + for x in range(self.SFP_PORT_START, self.SFP_PORT_END+1): + self.port_to_i2cbus_mapping[x] = (x - 52) + self.port_to_eeprom_mapping[x] = eeprom_path.format( + x - 52) + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num not in range(self.port_start, self.port_end + 1): + return False + + # Get path for access port presence status + port_name = self.get_port_name(port_num) + sysfs_filename = "qsfp_modprs" if port_num in self.qsfp_ports else "sfp_modabs" + self.PORT_INFO_PATH = self.QSFP_PORT_INFO_PATH if port_num in self.qsfp_ports else self.SFP_PORT_INFO_PATH + reg_path = "/".join([self.PORT_INFO_PATH, port_name, sysfs_filename]) + + # Read status + try: + reg_file = open(reg_path) + content = reg_file.readline().rstrip() + reg_value = int(content) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # Module present is active low + if reg_value == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid QSFP port_num + if port_num not in self.qsfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_lpmode"])) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # Read status + content = reg_file.readline().rstrip() + reg_value = int(content) + # low power mode is active high + if reg_value == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid QSFP port_num + if port_num not in self.qsfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_lpmode"]), "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = hex(lpmode) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + # Check for invalid QSFP port_num + if port_num not in self.qsfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_reset"]), "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(0)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open( + "/".join([self.PORT_INFO_PATH, port_name, "qsfp_reset"]), "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_file.seek(0) + reg_file.write(hex(1)) + reg_file.close() + + return True + + def get_transceiver_change_event(self, timeout=0): + """ + TBD + """ + raise NotImplementedError diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/pmon_daemon_control.json b/device/celestica/x86_64-cel_midstone-100x-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/__init__.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/__init__.py new file mode 100644 index 00000000000..4bfefa0fb63 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/__init__.py @@ -0,0 +1,3 @@ +__all__ = ["platform", "chassis"] +from sonic_platform import * + diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/chassis.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/chassis.py new file mode 100644 index 00000000000..e586ec49d77 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/chassis.py @@ -0,0 +1,412 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# + +try: + import sys + import time + from sonic_platform_base.chassis_base import ChassisBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN_TRAY = 5 +NUM_FAN = 2 +NUM_PSU = 2 +NUM_THERMAL = 18 +NUM_SFP = 64 +NUM_COMPONENT = 11 +RESET_REGISTER = "0xA106" +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +GETREG_PATH = "/sys/devices/platform/sys_cpld/getreg" +HOST_CHK_CMD = "docker > /dev/null 2>&1" + + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + #self.config_data = {} + ChassisBase.__init__(self) + self._api_helper = APIHelper() + + self.port_start = 0 + self.port_end = NUM_SFP - 1 + self.sfp_module_initialized = False + self.fan_module_initialized = False + self.__initialize_eeprom() + self.is_host = self._api_helper.is_host() + + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_sfp() + self.__initialize_components() + + self.modprs_register = self.get_transceiver_status() + + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, NUM_SFP): + sfp = Sfp(index) + self._sfp_list.append(sfp) + self.sfp_module_initialized = True + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fant_index in range(0, NUM_FAN_TRAY): + for fan_index in range(0, NUM_FAN): + if fant_index == 4 and fan_index == 0: + fan = Fan(fant_index, fan_index, True, 5) # PSU-1 FAN-1 + elif fant_index == 4 and fan_index == 1: + fan = Fan(fant_index, fan_index, True, 6) # PSU-2 FAN-1 + else: + fan = Fan(fant_index, fan_index) + self._fan_list.append(fan) + self.fan_module_initialized = True + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + airflow = self.__get_air_flow() + for index in range(0, NUM_THERMAL): + thermal = Thermal(index, airflow) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + def __get_air_flow(self): + air_flow_path = '/usr/share/sonic/device/{}/fan_airflow'.format(self._api_helper.platform) if self.is_host else '/usr/share/sonic/platform/fan_airflow' + air_flow = self._api_helper.read_one_line_file(air_flow_path) + return air_flow or 'B2F' + + 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.get_mac() + + 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.get_serial() + + 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.get_eeprom() + + 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. + + REBOOT_CAUSE_POWER_LOSS = "Power Loss" + REBOOT_CAUSE_THERMAL_OVERLOAD_CPU = "Thermal Overload: CPU" + REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC = "Thermal Overload: ASIC" + REBOOT_CAUSE_THERMAL_OVERLOAD_OTHER = "Thermal Overload: Other" + REBOOT_CAUSE_INSUFFICIENT_FAN_SPEED = "Insufficient Fan Speed" + REBOOT_CAUSE_WATCHDOG = "Watchdog" + REBOOT_CAUSE_HARDWARE_OTHER = "Hardware - Other" + REBOOT_CAUSE_NON_HARDWARE = "Non-Hardware" + + """ + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) + sw_reboot_cause = self._api_helper.read_txt_file( + reboot_cause_path) or "Unknown" + hw_reboot_cause = self._api_helper.get_cpld_reg_value( + GETREG_PATH, RESET_REGISTER) + + prev_reboot_cause = { + '0x11': (self.REBOOT_CAUSE_POWER_LOSS, "The last reset is Power on reset"), + '0x22': (self.REBOOT_CAUSE_HARDWARE_OTHER, "The last reset is soft-set CPU warm reset"), + '0x33': (self.REBOOT_CAUSE_HARDWARE_OTHER, "The last reset is soft-set CPU cold reset"), + '0x44': (self.REBOOT_CAUSE_NON_HARDWARE, "The last reset is CPU warm reset"), + '0x55': (self.REBOOT_CAUSE_NON_HARDWARE, "The last reset is CPU cold reset"), + '0x66': (self.REBOOT_CAUSE_WATCHDOG, "The last reset is watchdog reset"), + '0x77': (self.REBOOT_CAUSE_HARDWARE_OTHER, "The last reset is power cycle reset") + + }.get(hw_reboot_cause, (self.REBOOT_CAUSE_HARDWARE_OTHER, 'Unknown reason')) + + if sw_reboot_cause != 'Unknown': + prev_reboot_cause = ( + self.REBOOT_CAUSE_NON_HARDWARE, sw_reboot_cause) + + return prev_reboot_cause + + ############################################################## + ####################### SFP methods ########################## + ############################################################## + def get_num_sfps(self): + """ + Retrieves the number of sfps available on this chassis + Returns: + An integer, the number of sfps available on this chassis + """ + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return len(self._sfp_list) + + def get_all_sfps(self): + """ + Retrieves all sfps available on this chassis + Returns: + A list of objects derived from SfpBase representing all sfps + available on this chassis + """ + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return self._sfp_list + + def get_sfp(self, index): + """ + Retrieves sfp represented by (0-based) 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 + if not self.sfp_module_initialized: + self.__initialize_sfp() + + try: + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (0-{})\n".format( + index, len(self._sfp_list))) + return sfp + ############################################################## + ####################### Other methods ######################## + ############################################################## + + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + if self._watchdog is None: + from sonic_platform.watchdog import Watchdog + self._watchdog = Watchdog() + + return self._watchdog + + ############################################################## + ###################### Device methods ######################## + ############################################################## + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self._api_helper.hwsku + + 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 device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_pn() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self.get_serial_number() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_thermal_manager(self): + from .thermal_manager import ThermalManager + return ThermalManager + + def get_fan_status(self): + if not self.fan_module_initialized: + self.__initialize_fan() + + content = 0 + for fan in self._fan_list: + if fan.get_presence(): + content = content << 1 | 1 + else: + content = content << 1 + + return content + + def get_transceiver_status(self): + if not self.sfp_module_initialized: + self.__initialize_sfp() + + content = 0 + index = 0 + for sfp in self.get_all_sfps(): + if sfp.get_presence(): + content = content | (1 << index) + index = index + 1 + return content + + def get_num_components(self): + + return len(self._component_list) + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + + Returns: + (bool, dict): + - True if call successful, False if not; + - A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, + where device_id is the device ID for this device and + device_event, + status='1' represents device inserted, + status='0' represents device removed. + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0'}} + indicates that fan 0 has been removed, fan 2 + has been inserted and sfp 11 has been removed. + Specifically for SFP event, besides SFP plug in and plug out, + there are some other error event could be raised from SFP, when + these error happened, SFP eeprom will not be avalaible, XCVRD shall + stop to read eeprom before SFP recovered from error status. + status='2' I2C bus stuck, + status='3' Bad eeprom, + status='4' Unsupported cable, + status='5' High Temperature, + status='6' Bad cable. + """ + + start_time = time.time() + port_dict = {} + change_dict = {'fan':{}, 'sfp':{}} + port = self.port_start + forever = False + change_event = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + # Check for OIR events and return updated port_dict + reg_value = self.get_transceiver_status() + if reg_value != self.modprs_register: + changed_ports = self.modprs_register ^ reg_value + while port >= self.port_start and port <= self.port_end: + + # Mask off the bit corresponding to our port + mask = (1 << port) + + if changed_ports & mask: + # ModPrsL is active low + if reg_value & mask == 0: + port_dict[port] = '0' + else: + port_dict[port] = '1' + + port += 1 + + # Update reg value + self.modprs_register = reg_value + change_dict['sfp'] = port_dict + change_event = True + if change_event: + return True, change_dict + + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_dict + print "get_transceiver_change_event: Should not reach here." + return False, change_dict + + diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/component.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/component.py new file mode 100644 index 00000000000..d51d2b9d5c3 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/component.py @@ -0,0 +1,380 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# + +import subprocess + +try: + from sonic_platform_base.component_base import ComponentBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FPGA_VERSION_PATH = "/sys/devices/platform/fpga-board/version" +SYSCPLD_VERSION_PATH = "/sys/devices/platform/sys_cpld/version" +SWCPLD1_VERSION_PATH = "/sys/bus/i2c/devices/i2c-10/10-0030/version" +SWCPLD2_VERSION_PATH = "/sys/bus/i2c/devices/i2c-10/10-0031/version" +SWCPLD3_VERSION_PATH = "/sys/bus/i2c/devices/i2c-10/10-0032/version" +SWCPLD4_VERSION_PATH = "/sys/bus/i2c/devices/i2c-10/10-0033/version" +COMeCPLD_VERSION_cmd= "ipmitool raw 0x3a 0x3e 1 0x1a 1 0xe0" +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +Main_BMC_cmd = "ipmitool raw 0x32 0x8f 0x08 0x01" +Backup_BMC_cmd = "ipmitool raw 0x32 0x8f 0x08 0x02" +#Fan_CPLD_cmd = "ipmitool raw 0x3a 0x64 02 01 00" +COMPONENT_NAME_LIST = ["FPGA", "SYSCPLD", "SWCPLD1", "SWCPLD2", "SWCPLD3","SWCPLD4", "COMeCPLD", "Main_BMC", "Backup_BMC", "Main_BIOS", "Backup_BIOS"] +COMPONENT_DES_LIST = ["Used for managering the CPU and expanding I2C channels", "Used for managing the CPU", + "Used for managing QSFP+ ports (1-16)", "Used for managing QSFP+ ports (17-32)", "Used for managing QSFP+ ports (33-48)", "Used for managing QSFP+ ports (49-64)","Used for managing the COMe","Main Baseboard Management Controller", "Backup Baseboard Management Controller", "Main basic Input/Output System", "Backup basic Input/Output System"] + + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index): + ComponentBase.__init__(self) + self.index = component_index + self._api_helper = APIHelper() + self.name = self.get_name() + + def __get_bios_version(self): + # Retrieves the BIOS firmware version + status,result = self._api_helper.run_command("ipmitool raw 0x3a 0x64 00 01 0x70") + if result.strip() == "01": + if self.name == "Main_BIOS": + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + elif self.name == "Backup_BIOS": + bios_version = "na" + return bios_version + + elif result.strip() == "03": + if self.name == "Backup_BIOS": + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + elif self.name == "Main_BIOS": + bios_version = "na" + return bios_version + + def get_register_value(self, register): + # Retrieves the cpld register value + cmd = "echo {1} > {0}; cat {0}".format(GETREG_PATH, register) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err is not '': + return None + return raw_data.strip() + + def __get_cpld_version(self): + if self.name == "SYSCPLD": + try: + with open(SYSCPLD_VERSION_PATH, 'r') as fd: + syscpld_version = fd.read() + return syscpld_version.strip() + except Exception as e: + return None + elif self.name == "SWCPLD1": + try: + with open(SWCPLD1_VERSION_PATH, 'r') as fd: + swcpld1_version = fd.read() + return swcpld1_version.strip() + except Exception as e: + return None + elif self.name == "SWCPLD2": + try: + with open(SWCPLD2_VERSION_PATH, 'r') as fd: + swcpld2_version = fd.read() + return swcpld2_version.strip() + except Exception as e: + return None + elif self.name == "SWCPLD3": + try: + with open(SWCPLD3_VERSION_PATH, 'r') as fd: + swcpld3_version = fd.read() + return swcpld3_version.strip() + except Exception as e: + return None + elif self.name == "SWCPLD4": + try: + with open(SWCPLD4_VERSION_PATH, 'r') as fd: + swcpld4_version = fd.read() + return swcpld4_version.strip() + except Exception as e: + return None + elif self.name == "COMeCPLD": + status, ver = self._api_helper.run_command(COMeCPLD_VERSION_cmd) + version1 = int(ver.strip()) / 10 + version2 = int(ver.strip()) % 10 + version = "%s.%s" % (version1, version2) + return str(version) + elif self.name == "FANCPLD": + status,ver = self._api_helper.run_command(Fan_CPLD_cmd) + version = int(ver.strip(), 16) + return str(version) + + def __get_fpga_version(self): + # Retrieves the FPGA firmware version + try: + with open(FPGA_VERSION_PATH, 'r') as fd: + version = fd.read() + fpga_version = (version.strip().split("x")[1]) + return fpga_version.strip() + except Exception as e: + return None + + def __get_bmc_version(self): + # Retrieves the BMC firmware version + cmd = Main_BMC_cmd if self.name == "Main_BMC" else Backup_BMC_cmd + stasus, ver = self._api_helper.run_command(cmd) + return ver.strip() + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_NAME_LIST[self.index] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_DES_LIST[self.index] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if "BIOS" in self.name: + fw_version = self.__get_bios_version() + elif "CPLD" in self.name: + fw_version = self.__get_cpld_version() + elif self.name == "FPGA": + fw_version = self.__get_fpga_version() + elif "BMC" in self.name: + version = self.__get_bmc_version() + version_1 = int(version.strip().split(" ")[0], 16) + version_2 = int(version.strip().split(" ")[1], 16) + fw_version = "%s.%s" % (version_1, version_2) + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + + #if not os.path.isfile(image_path): + # return False + + #op_cmd = "ipmitool raw 0x32 0xaa 0x00" + #cl_cmd = "ipmitool raw 0x32 0xaa 0x01" + #if "FPGA" in self.name: + + # """img_name = os.path.basename(image_path) + # root, ext = os.path.splitext(img_name) + # ext = ".vme" if ext == "" else ext + # new_image_path = os.path.join("/tmp", (root.lower() + ext)) + # shutil.copy(image_path, new_image_path)""" + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/fpga_prog /sys/bus/pci/devices/0000:0b:00.0/resource0 %s" % image_path + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Programing is complete' in result: + # print("Update success") + # else: + # print("Update failed") + + #elif self.name == "Main_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 2 -mse 1 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + + # elif self.name == "Backup_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 2 -mse 2 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + + # elif self.name == "Main_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 1 %s" % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...Plz wait for about 180s") + # else: + # print("Update failed") + + # elif self.name == "Backup_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 2 %s" % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...") + # else: + # print("Update failed") + + # elif "CPLD" in self.name: + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 4 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + + #not support because firmare update need 3rd tools that can't be submitted to community + return False + + def update_firmware(self, image_path): + #if not os.path.isfile(image_path): + # return False + + #op_cmd = "ipmitool raw 0x32 0xaa 0x00" + #cl_cmd = "ipmitool raw 0x32 0xaa 0x01" + #if "FPGA" in self.name: + + # """img_name = os.path.basename(image_path) + # root, ext = os.path.splitext(img_name) + # ext = ".vme" if ext == "" else ext + # new_image_path = os.path.join("/tmp", (root.lower() + ext)) + # shutil.copy(image_path, new_image_path)""" + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/fpga_prog /sys/bus/pci/devices/0000:0b:00.0/resource0 %s" % image_path + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Programing is complete' in result: + # print("Update success") + # else: + # print("Update failed") + + #elif self.name == "Main_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 2 -mse 1 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + + #elif self.name == "Backup_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 2 -mse 2 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + + #elif self.name == "Main_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 1 %s" % image_path + # print("Updating now...Please wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...Please wait for about 180s") + # else: + # print("Update failed") + + #elif self.name == "Backup_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 2 %s" % image_path + # print("Updating now...Please wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...") + # else: + # print("Update failed") + + #elif "CPLD" in self.name: + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 4 %s " % image_path + # print("Updating now...Please wait...") + # status, result = self._api_helper.run_command(install_command) + # if status == False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + #not support firmware update because 3rd tools can't be uploaded to community + return False + diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/eeprom.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/eeprom.py new file mode 100644 index 00000000000..2a92e3c466f --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/eeprom.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica Silverstone-x +# +# 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 + import sys + import re + from cStringIO import StringIO + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' +TLV_EEPROM_I2C_BUS = 0 +TLV_EEPROM_I2C_ADDR = 56 + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + # TLV Value Display Switch + _TLV_DISPLAY_VENDOR_EXT = True + + def __init__(self): + self._eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-00{1}/eeprom".format(TLV_EEPROM_I2C_BUS, TLV_EEPROM_I2C_ADDR) + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except Exception: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + try: + self.read_eeprom_db() + except Exception: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if 'ok' not in status: + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except Exception: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except Exception: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") + + def get_pn(self): + return self._eeprom.get('0x22', "Undefined.") + diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/fan.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/fan.py new file mode 100644 index 00000000000..1b5ff3874ca --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/fan.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +import math + +try: + from sonic_platform_base.fan_base import FanBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", "FAN-3F", "FAN-3R", + "FAN-4F", "FAN-4R"] + +IPMI_OEM_NETFN = "0x3A" +IPMI_SENSOR_NETFN = "0x3A 0x63" +IPMI_FAN_SPEED_CMD = "0x04 {}" # fan speed +IPMI_GET_PSU1_FAN_SPEED_CMD = "0x3e 0x06 0xb0 2 0x90" +IPMI_GET_PSU2_FAN_SPEED_CMD = "0x3e 0x06 0xb2 2 0x90" +IPMI_GET_FAN_TARGET_SPEED_CMD = "0x3e 0 0x1a 1 {}" +IPMI_AIR_FLOW_CMD = "0x63 0x15 {}" # air flow +IPMI_AIR_PSU_FLOW_CMD = "0x62 {}" # psu air flow +IPMI_FAN_PRESENT_CMD = "0x63 0x03 {}" +IPMI_SET_FAN_LED_CMD = "0x39 0x02 {} {}" +IPMI_GET_FAN_LED_CMD = "0x39 0x01 {}" +IPMI_SET_PWM_CMD = "0x63 0x09 {} {}" +IPMI_SET_FAN_MANUAL_CMD = "0x63 0x01 0x00" +IPMI_SET_FAN_LED_MANUAL_CMD = "0x42 0x02 0x00" +IPMI_FRU_PRINT_ID = "ipmitool fru print {}" +IPMI_FRU_MODEL_KEY = "Board Part Number" +IPMI_FRU_SERIAL_KEY = "Board Serial" + +MAX_OUTLET = 12600 # F2B xiqi +MAX_INLET = 10300 # B2F paiqi +SPEED_TOLERANCE = 10 + + + +FAN_LED_OFF_CMD = "0x00" +FAN_LED_GREEN_CMD = "0x01" +FAN_LED_AMBER_CMD = "0x02" +FAN1_FRU_ID = 6 + + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): + self.fan_index = fan_index + self.fan_tray_index = fan_tray_index + self.is_psu_fan = is_psu_fan + if self.is_psu_fan: + self.psu_index = psu_index + self._api_helper = APIHelper() + self.index = self.fan_tray_index * 2 + self.fan_index + + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + direction = self.FAN_DIRECTION_EXHAUST + + if self.fan_tray_index < 4: + fan_tray_index_ = self.fan_tray_index + 1 + ipmi_cmd = IPMI_AIR_FLOW_CMD + else: + fan_tray_index_ = self.psu_index - 1 + ipmi_cmd = IPMI_AIR_PSU_FLOW_CMD + + status, raw_flow = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, ipmi_cmd.format(hex(fan_tray_index_))) + + if status and raw_flow == "01": + direction = self.FAN_DIRECTION_INTAKE + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + Note: + M = 150 + Max F2B = 12600 RPM + Max B2F = 10300 RPM + """ + # ipmitool raw 0x3a 0x03 0x01 0x01 {register} + # register = 22 32 42 52 62 72 82 + max_rpm = MAX_INLET if self.fan_index % 2 == 0 else MAX_OUTLET + + if self.fan_tray_index < 4: + fan_tray_index_ = self.fan_tray_index + 1 + status, raw_ss_read = self._api_helper.ipmi_raw(IPMI_SENSOR_NETFN,IPMI_FAN_SPEED_CMD.format(fan_tray_index_)) + if self.fan_index % 2 == 0: # self.fan_index = 0 + ss_read = raw_ss_read.split()[0] + else: + ss_read = raw_ss_read.split()[1] # self.fan_index = 1 + rpm_speed = int(ss_read, 16)*60 + speed = int(float(rpm_speed) / max_rpm * 100) + else: + if self.psu_index == 5: + status, raw_ss_read = self._api_helper.ipmi_raw(IPMI_OEM_NETFN,IPMI_GET_PSU1_FAN_SPEED_CMD) + else: + status, raw_ss_read = self._api_helper.ipmi_raw(IPMI_OEM_NETFN,IPMI_GET_PSU2_FAN_SPEED_CMD) + + raw_ss_read_reverse = raw_ss_read.split()[::-1] + data_high = ('{0:0{1}b}'.format(int(raw_ss_read_reverse[0], 16), len(raw_ss_read_reverse[0]) * 4)) + n_bin = data_high[:5] + n = int(n_bin, 2) + data_low = ('{0:0{1}b}'.format(int(raw_ss_read_reverse[1], 16), len((raw_ss_read_reverse[0]) * 4))) + y_bin = data_high[-3:] + data_low + y = int(y_bin, 2) + rpm_speed = float(y * 2 ** n) + speed = int(rpm_speed / max_rpm * 100) + + return speed if speed <= 100 else rpm_speed + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + Note: + speed_pc = pwm_target/255*100 + 0 : when PWM mode is use + pwm : when pwm mode is not use + """ + if self.fan_tray_index < 4: + ss_cmd = "0x4%s" % (hex(self.fan_tray_index * 4)[-1]) + status,raw_ss_read = self._api_helper.ipmi_raw(IPMI_OEM_NETFN,IPMI_GET_FAN_TARGET_SPEED_CMD.format(ss_cmd)) + pwm = int(raw_ss_read,16) + target = math.ceil(float(pwm)*100/255) + else: + target = "N/A" + return target + + 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 + """ + return SPEED_TOLERANCE + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + Notes: + pwm setting mode must set as Manual + manual: ipmitool raw 0x3a 0x63 0x01 0x00 + auto: ipmitool raw 0x3a 0x63 0x01 0x1 + """ + # ipmitool raw 0x3a 0x63 0x09 {fan_id} {pwm_speed} + + speed_hex = hex(int(float(speed)/100 * 255)) + if self.fan_tray_index < 4: + fan_tray_index_ = self.fan_tray_index + 1 + else: + fan_tray_index_ = self.psu_index + + status, set_manual_res = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_SET_FAN_MANUAL_CMD) + status, set_speed_res = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_SET_PWM_CMD.format(hex(fan_tray_index_),speed_hex)) + + set_speed = False if not status else True + return set_speed + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + Note: + LED setting mode must set as Manual + manual: ipmitool raw 0x3A 0x42 0x02 0x00 + auto: ipmitool raw 0x3A 0x42 0x02 0x01 + """ + led_cmd = { + self.STATUS_LED_COLOR_GREEN: FAN_LED_GREEN_CMD, + self.STATUS_LED_COLOR_AMBER: FAN_LED_AMBER_CMD, + self.STATUS_LED_COLOR_OFF: FAN_LED_OFF_CMD + }.get(color) + + if self.fan_tray_index < 4: + fan_tray_index_ = self.fan_tray_index + 4 + else: + fan_tray_index_ = 2 + + status, set_manual_res = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_SET_FAN_LED_MANUAL_CMD) + status, set_led = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_SET_FAN_LED_CMD.format(fan_tray_index_, led_cmd)) + set_status_led = False if not status else True + return set_status_led + + def get_status_led(self): + """ + Gets the state of the fan status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + Note: + STATUS_LED_COLOR_GREEN = "green" + STATUS_LED_COLOR_AMBER = "amber" + STATUS_LED_COLOR_RED = "red" + STATUS_LED_COLOR_OFF = "off" + """ + if self.fan_tray_index < 4: + fan_tray_index_ = self.fan_tray_index + 4 + else: + fan_tray_index_ = 2 + + status, hx_color = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_GET_FAN_LED_CMD.format(fan_tray_index_)) + status_led = { + "00": self.STATUS_LED_COLOR_OFF, + "01": self.STATUS_LED_COLOR_GREEN, + "02": self.STATUS_LED_COLOR_AMBER, + }.get(hx_color, self.STATUS_LED_COLOR_OFF) + return status_led + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + if not self.is_psu_fan: + fan_name = FAN_NAME_LIST[self.fan_tray_index*2 + self.fan_index] + else: + fan_name = "PSU-{} FAN-1".format(self.psu_index-4) + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + + presence = False + + if self.fan_tray_index < 4: + fan_tray_index_ = self.fan_tray_index + 1 + else: + fan_tray_index_ = self.psu_index + status, raw_present = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_FAN_PRESENT_CMD.format(hex(fan_tray_index_))) + + if status and raw_present == "01": + presence = True + + return presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + model = "Unknown" + ipmi_fru_idx = self.fan_tray_index + FAN1_FRU_ID + status, raw_model = self._api_helper.ipmi_fru_id(ipmi_fru_idx, IPMI_FRU_MODEL_KEY) + + fru_pn_list = raw_model.split() + if len(fru_pn_list) > 4: + model = fru_pn_list[4] + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial = "Unknown" + ipmi_fru_idx = self.fan_tray_index + FAN1_FRU_ID + status, raw_model = self._api_helper.ipmi_fru_id(ipmi_fru_idx, IPMI_FRU_SERIAL_KEY) + + fru_sr_list = raw_model.split() + if len(fru_sr_list) > 3: + serial = fru_sr_list[3] + + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + + return self.get_presence() and self.get_speed() > 0 + diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/helper.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/helper.py new file mode 100644 index 00000000000..5198efbb5ba --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/helper.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python + +import os +import struct +import subprocess +from sonic_py_common import device_info +from mmap import * + +HOST_CHK_CMD = "docker > /dev/null 2>&1" +EMPTY_STRING = "" + + +class APIHelper(): + + def __init__(self): + (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() + + def is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def pci_get_value(self, resource, offset): + status = True + result = "" + try: + fd = os.open(resource, os.O_RDWR) + mm = mmap(fd, 0) + mm.seek(int(offset)) + read_data_stream = mm.read(4) + result = struct.unpack('I', read_data_stream) + except Exception: + status = False + return status, result + + def run_command(self, cmd): + status = True + result = "" + try: + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + except Exception: + status = False + return status, result + + def run_interactive_command(self, cmd): + try: + os.system(cmd) + except Exception: + return False + return True + + def read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def read_one_line_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.readline() + return data.strip() + except IOError: + pass + return None + + def write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except Exception as E: + print(str(E)) + return False + return True + + def get_cpld_reg_value(self, getreg_path, register): + cmd = "echo {1} > {0}; cat {0}".format(getreg_path, register) + status, result = self.run_command(cmd) + return result if status else None + + def ipmi_raw(self, netfn, cmd): + status = True + result = "" + try: + cmd = "ipmitool raw {} {}".format(str(netfn), str(cmd)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_fru_id(self, id, key=None): + status = True + result = "" + try: + cmd = "ipmitool fru print {}".format(str( + id)) if not key else "ipmitool fru print {0} | grep '{1}' ".format(str(id), str(key)) + + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_set_ss_thres(self, id, threshold_key, value): + status = True + result = "" + try: + cmd = "ipmitool sensor thresh '{}' {} {}".format( + str(id), str(threshold_key), str(value)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/platform.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/platform.py new file mode 100644 index 00000000000..a632de87e74 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/platform.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# 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): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/psu.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/psu.py new file mode 100644 index 00000000000..7e6c15eedc3 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/psu.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import subprocess +import re +import math + +try: + from sonic_platform_base.psu_base import PsuBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] + +PSU_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "5a" + }, + 1: { + "num": 11, + "addr": "5b" + }, +} +IPMI_OEM_NETFN = "0x39" +IPMI_SENSOR_NETFN = "0x04" +IPMI_SS_READ_CMD = "0x2D {}" +IPMI_SET_PSU_LED_CMD = "0x02 0x02 {}" +IPMI_GET_PSU_LED_CMD = "0x01 0x02" +IPMI_FRU_PRINT_ID = "ipmitool fru print {}" +IPMI_FRU_MODEL_KEY = "Product Part Number" +IPMI_FRU_SERIAL_KEY = "Product Serial " + +PSU_LED_OFF_CMD = "0x00" +PSU_LED_GREEN_CMD = "0x01" +PSU_LED_AMBER_CMD = "0x02" + +PSU1_VOUT_SS_ID = "0x2f" +PSU1_COUT_SS_ID = "0x30" +PSU1_POUT_SS_ID = "0x31" +PSU1_STATUS_REG = "0x29" +PSU1_TMP1_REG = "0x2d" +PSU1_TMP2_REG = "0x2e" + +PSU2_VOUT_SS_ID = "0x39" +PSU2_COUT_SS_ID = "0x3a" +PSU2_POUT_SS_ID = "0x3b" +PSU2_STATUS_REG = "0x33" +PSU2_TMP1_REG = "0x37" +PSU2_TMP2_REG = "0x38" + +PSU1_FRU_ID = 4 + +SS_READ_OFFSET = 0 +PSU_MAX_POWER = 1300 + +class Psu(PsuBase): + """Platform-specific Psu class""" + + def __init__(self, psu_index): + PsuBase.__init__(self) + self.index = psu_index + self._api_helper = APIHelper() + + self.psu1_id = "0x29" + self.psu2_id = "0x33" + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + psu_vout_key = globals()['PSU{}_VOUT_SS_ID'.format(self.index + 1)] + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_vout_key)) + ss_read = raw_ss_read.split()[SS_READ_OFFSET] + # Formula: Rx1x10^-1 + psu_voltage = int(ss_read, 16) * math.pow(10, -1) + + return psu_voltage + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + psu_cout_key = globals()['PSU{}_COUT_SS_ID'.format(self.index + 1)] + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_cout_key)) + ss_read = raw_ss_read.split()[SS_READ_OFFSET] + # Formula: Rx5x10^-1 + psu_current = int(ss_read, 16) * 5 * math.pow(10, -1) + + return psu_current + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + psu_pout_key = globals()['PSU{}_POUT_SS_ID'.format(self.index + 1)] + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_pout_key)) + ss_read = raw_ss_read.split()[SS_READ_OFFSET] + # Formula: Rx6x10^0 + psu_power = int(ss_read, 16) * 6 + return float(psu_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. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + Note + Set manual + ipmitool raw 0x3a 0x42 0x2 0x00 + """ + led_cmd = { + self.STATUS_LED_COLOR_GREEN: PSU_LED_GREEN_CMD, + self.STATUS_LED_COLOR_AMBER: PSU_LED_AMBER_CMD, + self.STATUS_LED_COLOR_OFF: PSU_LED_OFF_CMD + }.get(color) + self._api_helper.ipmi_raw("0x3a 0x42 0x02 0x00") + status, set_led = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_SET_PSU_LED_CMD.format(led_cmd)) + set_status_led = False if not status else True + + return set_status_led + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status, hx_color = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_GET_PSU_LED_CMD) + + status_led = { + "00": self.STATUS_LED_COLOR_OFF, + "01": self.STATUS_LED_COLOR_GREEN, + "02": self.STATUS_LED_COLOR_AMBER, + }.get(hx_color, self.STATUS_LED_COLOR_OFF) + + return status_led + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + @staticmethod + def run_command(command): + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + (out, err) = proc.communicate() + + if proc.returncode != 0: + sys.exit(proc.returncode) + + return out + + @staticmethod + def find_value(in_string): + result = re.search("^.+ ([0-9a-f]{2}) .+$", in_string) + if result: + return result.group(1) + else: + return result + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + if self.index is None: + return False + ipmi_raw = "ipmitool raw 0x4 0x2d" + psu_id = self.psu1_id if self.index == 1 else self.psu2_id + res_string = self.run_command(ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + presence = ( int(status_byte, 16) >> 0 ) & 1 + if presence: + return True + else: + return False + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + eg.ipmitool fru print 4 + Product Manufacturer : DELTA + Product Name : DPS-1300AB-6 J + Product Part Number : DPS-1300AB-6 J + Product Version : S1F + Product Serial : JDMD2111000125 + Product Asset Tag : S1F + """ + model = "Unknown" + ipmi_fru_idx = self.index + PSU1_FRU_ID + status, raw_model = self._api_helper.ipmi_fru_id( + ipmi_fru_idx, IPMI_FRU_MODEL_KEY) + + fru_pn_list = raw_model.split() + if len(fru_pn_list) > 4: + model = fru_pn_list[4] + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial = "Unknown" + ipmi_fru_idx = self.index + PSU1_FRU_ID + status, raw_model = self._api_helper.ipmi_fru_id( + ipmi_fru_idx, IPMI_FRU_SERIAL_KEY) + + fru_sr_list = raw_model.split() + if len(fru_sr_list) > 3: + serial = fru_sr_list[3] + + return serial + + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.index is None: + return False + ipmi_raw = "ipmitool raw 0x4 0x2d" + psu_id = self.psu1_id if self.index == 1 else self.psu2_id + res_string = self.run_command(ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + failure_detected = (int(status_byte, 16) >> 1) & 1 + input_lost = (int(status_byte, 16) >> 3) & 1 + if failure_detected or input_lost: + return False + else: + return True diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/sfp.py new file mode 100644 index 00000000000..1495d184a8f --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/sfp.py @@ -0,0 +1,1358 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +# +############################################################################# + +import time +from ctypes import create_string_buffer + +try: + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId + from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.inf8628 import inf8628InterfaceId + from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +INFO_OFFSET = 128 +DOM_OFFSET = 0 + +# definitions of the offset and width for values in XCVR info eeprom +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_QSFP = 20 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_TYPE_OFFSET = 0 +XCVR_TYPE_WIDTH = 1 +XCVR_EXT_TYPE_OFFSET = 1 +XCVR_EXT_TYPE_WIDTH = 1 +XCVR_CONNECTOR_OFFSET = 2 +XCVR_CONNECTOR_WIDTH = 1 +XCVR_COMPLIANCE_CODE_OFFSET = 3 +XCVR_COMPLIANCE_CODE_WIDTH = 8 +XCVR_ENCODING_OFFSET = 11 +XCVR_ENCODING_WIDTH = 1 +XCVR_NBR_OFFSET = 12 +XCVR_NBR_WIDTH = 1 +XCVR_EXT_RATE_SEL_OFFSET = 13 +XCVR_EXT_RATE_SEL_WIDTH = 1 +XCVR_CABLE_LENGTH_OFFSET = 14 +XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_CABLE_LENGTH_WIDTH_SFP = 6 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_HW_REV_WIDTH_SFP = 4 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 2 + +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 + +# definitions of the offset for values in OSFP info eeprom +OSFP_TYPE_OFFSET = 0 +OSFP_VENDOR_NAME_OFFSET = 129 +OSFP_VENDOR_PN_OFFSET = 148 +OSFP_HW_REV_OFFSET = 164 +OSFP_VENDOR_SN_OFFSET = 166 + +# Offset for values in QSFP eeprom +QSFP_DOM_REV_OFFSET = 1 +QSFP_DOM_REV_WIDTH = 1 +QSFP_RESET_STATUS_OFFSET = 6 +QSFP_RESET_STATUS_WIDTH = 1 +QSFP_TEMPE_OFFSET = 22 +QSFP_TEMPE_WIDTH = 2 +QSFP_VOLT_OFFSET = 26 +QSFP_VOLT_WIDTH = 2 +QSFP_VERSION_COMPLIANCE_OFFSET = 1 +QSFP_VERSION_COMPLIANCE_WIDTH = 2 +QSFP_CHANNL_MON_OFFSET = 34 +QSFP_CHANNL_MON_WIDTH = 16 +QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 +QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 +QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 +QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_MODULE_MONITOR_OFFSET = 0 +QSFP_MODULE_MONITOR_WIDTH = 9 +QSFP_POWEROVERRIDE_OFFSET = 93 +QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_POWEROVERRIDE_BIT = 0 +QSFP_POWERSET_BIT = 1 +QSFP_OPTION_VALUE_OFFSET = 192 +QSFP_OPTION_VALUE_WIDTH = 4 +QSFP_MODULE_UPPER_PAGE3_START = 384 +QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_WIDTH = 24 +QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_WIDTH = 24 + +SFP_MODULE_ADDRA2_OFFSET = 256 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 56 +SFP_CHANNL_THRESHOLD_OFFSET = 112 +SFP_CHANNL_THRESHOLD_WIDTH = 2 + +SFP_TEMPE_OFFSET = 96 +SFP_TEMPE_WIDTH = 2 +SFP_VOLT_OFFSET = 98 +SFP_VOLT_WIDTH = 2 +SFP_CHANNL_MON_OFFSET = 100 +SFP_CHANNL_MON_WIDTH = 6 +SFP_CHANNL_STATUS_OFFSET = 110 +SFP_CHANNL_STATUS_WIDTH = 1 + + +qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', + 'Length OM2(m)', 'Length OM1(m)', + 'Length Cable Assembly(m)') + +sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + +sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes', 'FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia', 'FibreChannelSpeed') + +qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', + 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', + 'Fibre Channel transmission media', 'Fibre Channel Speed') + +SFP_TYPE = "SFP" +QSFP_TYPE = "QSFP" +OSFP_TYPE = "OSFP" + +PORT_START = 1 +PORT_END = 66 +QSFP_PORT_START = 1 +QSFP_PORT_END = 64 + +SFP_PORT_START = 65 +SFP_PORT_END = 66 + +SFP_I2C_START = 16 + + +class Sfp(SfpBase): + """Platform-specific Sfp class""" + + # Path to QSFP sysfs + RESET_PATH = "/sys/class/SFF/QSFP{0}/qsfp_reset" + LP_PATH = "/sys/class/SFF/QSFP{0}/qsfp_lpmode" + QSFP_PRS_PATH = "/sys/class/SFF/QSFP{0}/qsfp_modprs" + SFP_PRS_PATH = "/sys/devices/platform/cls-xcvr/SFP{0}/sfp_modabs" + PLATFORM_ROOT_PATH = "/usr/share/sonic/device" + PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" + + def __init__(self, sfp_index): + SfpBase.__init__(self) + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + self.dom_supported = False + self.sfp_type, self.port_name = self.__get_sfp_info() + self._api_helper = APIHelper() + self.platform = self._api_helper.platform + self.hwsku = self._api_helper.hwsku + + # Init eeprom path + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + self.port_to_eeprom_mapping = {} + self.port_to_i2c_mapping = {} + + for x in range(PORT_START, PORT_END + 1): + self.port_to_i2c_mapping[x] = (SFP_I2C_START - PORT_START + x) + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + + self.info_dict_keys = ['type', 'type_abbrv_name', 'hardware_rev', 'serial', 'manufacturer', 'model', 'connector', 'encoding', 'ext_identifier', + 'ext_rateselect_compliance', 'cable_type', 'cable_length', 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui'] + + self.dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', 'power_lpmode', 'tx_disable', 'tx_disabled_channel', 'temperature', 'voltage', + 'rx1power', 'rx2power', 'rx3power', 'rx4power', 'tx1bias', 'tx2bias', 'tx3bias', 'tx4bias', 'tx1power', 'tx2power', 'tx3power', 'tx4power'] + + self.threshold_dict_keys = ['temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', 'txpowerhighalarm', 'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning', 'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm', 'txbiaslowwarning'] + + self._dom_capability_detect() + + def __get_sfp_info(self): + port_name = "Unknown" + sfp_type = "Unknown" + + if self.port_num >= QSFP_PORT_START and self.port_num <= QSFP_PORT_END: + sfp_type = QSFP_TYPE + port_name = "QSFP" + str(self.port_num - QSFP_PORT_START) + elif self.port_num >= SFP_PORT_START and self.port_num <= SFP_PORT_END: + sfp_type = SFP_TYPE + port_name = "SFP" + str(self.port_num - SFP_PORT_START) + return sfp_type, port_name + + def __convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + def __get_path_to_port_config_file(self): + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.platform]) + hwsku_path = "/".join([platform_path, self.hwsku] + ) if self._api_helper.is_host() else self.PMON_HWSKU_PATH + return "/".join([hwsku_path, "port_config.ini"]) + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except Exception: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def _dom_capability_detect(self): + if not self.get_presence(): + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + return + + if self.sfp_type == "QSFP": + self.calibration = 1 + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + offset = INFO_OFFSET + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qsfp_version_compliance_raw = self.__read_eeprom_specific_bytes( + QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) + qsfp_version_compliance = int( + qsfp_version_compliance_raw[0], 16) + dom_capability = sfpi_obj.parse_qsfp_dom_capability( + qsfp_dom_capability_raw, 0) + if qsfp_version_compliance >= 0x08: + self.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' + self.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' + else: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = True + + self.dom_supported = True + self.calibration = 1 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + qsfp_option_value_raw = self.__read_eeprom_specific_bytes( + QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) + if qsfp_option_value_raw is not None: + optional_capability = sfpd_obj.parse_option_params( + qsfp_option_value_raw, 0) + self.dom_tx_disable_supported = optional_capability[ + 'data']['TxDisable']['value'] == 'On' + dom_status_indicator = sfpd_obj.parse_dom_status_indicator( + qsfp_version_compliance_raw, 1) + self.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.qsfp_page3_available = False + + elif self.sfp_type == "SFP": + sfpi_obj = sff8472InterfaceId() + if sfpi_obj is None: + return None + sfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + XCVR_DOM_CAPABILITY_OFFSET, XCVR_DOM_CAPABILITY_WIDTH) + if sfp_dom_capability_raw is not None: + sfp_dom_capability = int(sfp_dom_capability_raw[0], 16) + self.dom_supported = (sfp_dom_capability & 0x40 != 0) + if self.dom_supported: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = True + self.dom_tx_power_supported = True + if sfp_dom_capability & 0x20 != 0: + self.calibration = 1 + elif sfp_dom_capability & 0x10 != 0: + self.calibration = 2 + else: + self.calibration = 0 + else: + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.dom_tx_disable_supported = ( + int(sfp_dom_capability_raw[1], 16) & 0x40 != 0) + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + nominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + ======================================================================== + """ + compliance_code_dict = {} + transceiver_info_dict = dict.fromkeys(self.info_dict_keys, 'N/A') + if not self.get_presence(): + return transceiver_info_dict + + # ToDo: QSFP transceiver info parsing not fully supported. + # in inf8628.py lack of some memory map definition + # will be implemented when the inf8628 memory map ready + if self.sfp_type == OSFP_TYPE: + offset = 0 + vendor_rev_width = XCVR_HW_REV_WIDTH_OSFP + + sfpi_obj = inf8628InterfaceId() + if sfpi_obj is None: + return None + + sfp_type_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_TYPE_OFFSET), XCVR_TYPE_WIDTH) + if sfp_type_raw is not None: + sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + else: + return None + + sfp_vendor_name_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + if sfp_vendor_name_raw is not None: + sfp_vendor_name_data = sfpi_obj.parse_vendor_name( + sfp_vendor_name_raw, 0) + else: + return None + + sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + if sfp_vendor_pn_raw is not None: + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( + sfp_vendor_pn_raw, 0) + else: + return None + + sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_HW_REV_OFFSET), vendor_rev_width) + if sfp_vendor_rev_raw is not None: + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( + sfp_vendor_rev_raw, 0) + else: + return None + + sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + if sfp_vendor_sn_raw is not None: + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( + sfp_vendor_sn_raw, 0) + else: + return None + + transceiver_info_dict['type'] = sfp_type_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = 'N/A' + transceiver_info_dict['vendor_date'] = 'N/A' + transceiver_info_dict['connector'] = 'N/A' + transceiver_info_dict['encoding'] = 'N/A' + transceiver_info_dict['ext_identifier'] = 'N/A' + transceiver_info_dict['ext_rateselect_compliance'] = 'N/A' + transceiver_info_dict['cable_type'] = 'N/A' + transceiver_info_dict['cable_length'] = 'N/A' + transceiver_info_dict['specification_compliance'] = '{}' + transceiver_info_dict['nominal_bit_rate'] = 'N/A' + + else: + if self.sfp_type == QSFP_TYPE: + offset = INFO_OFFSET + vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP + # cable_length_width = XCVR_CABLE_LENGTH_WIDTH_QSFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP + + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + else: + offset = 0 + vendor_rev_width = XCVR_HW_REV_WIDTH_SFP + # cable_length_width = XCVR_CABLE_LENGTH_WIDTH_SFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_SFP + + sfpi_obj = sff8472InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( + offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: + return None + + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date( + sfp_interface_bulk_raw[start: end], 0) + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ + 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] + + + if self.sfp_type == QSFP_TYPE: + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + else: + for key in sfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + for key in sfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value']) + + if "QSFP-DD" in transceiver_info_dict['type']: + transceiver_info_dict['type_abbrv_name'] = "QSFP-DD" + elif "SFP" in transceiver_info_dict['type']: + transceiver_info_dict['type_abbrv_name'] = "SFP" + else: + transceiver_info_dict['type_abbrv_name'] = "N/A" + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + rx_los |BOOLEAN |RX loss-of-signal status, True if has RX los, False if not. + tx_fault |BOOLEAN |TX fault status, True if has TX fault, False if not. + reset_status |BOOLEAN |reset status, True if SFP in reset, False if not. + lp_mode |BOOLEAN |low power mode status, True in lp mode, False if not. + tx_disable |BOOLEAN |TX disable status, True TX disabled, False if not. + tx_disabled_channel |HEX |disabled TX channels in hex, bits 0 to 3 represent channel 0 + | |to channel 3. + temperature |INT |module temperature in Celsius + voltage |INT |supply voltage in mV + txbias |INT |TX Bias Current in mA, n is the channel number, + | |for example, tx2bias stands for tx bias of channel 2. + rxpower |INT |received optical power in mW, n is the channel number, + | |for example, rx2power stands for rx power of channel 2. + txpower |INT |TX output power in mW, n is the channel number, + | |for example, tx2power stands for tx power of channel 2. + ======================================================================== + """ + transceiver_dom_info_dict = dict.fromkeys(self.dom_dict_keys, 'N/A') + + if self.sfp_type == OSFP_TYPE: + pass + + elif self.sfp_type == QSFP_TYPE: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_temp_supported: + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature( + dom_data_raw[start: end], 0) + temp = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage( + dom_data_raw[start: end], 0) + volt = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( + dom_data_raw[start: end], 0) + + if self.dom_tx_power_supported: + transceiver_dom_info_dict['tx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX4Power']['value']) + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX4Power']['value']) + + transceiver_dom_info_dict['tx1bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX1Bias']['value']) + transceiver_dom_info_dict['tx2bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX2Bias']['value']) + transceiver_dom_info_dict['tx3bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX3Bias']['value']) + transceiver_dom_info_dict['tx4bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX4Bias']['value']) + + else: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 256 + sfpd_obj = sff8472Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + sfpd_obj._calibration_type = self.calibration + + dom_data_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_DOM_BULK_DATA_START), SFP_DOM_BULK_DATA_SIZE) + + start = SFP_TEMPE_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature( + dom_data_raw[start: end], 0) + + start = SFP_VOLT_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage( + dom_data_raw[start: end], 0) + + start = SFP_CHANNL_MON_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_CHANNL_MON_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( + dom_data_raw[start: end], 0) + + transceiver_dom_info_dict['temperature'] = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + transceiver_dom_info_dict['voltage'] = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + transceiver_dom_info_dict['rx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RXPower']['value']) + transceiver_dom_info_dict['tx1bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TXBias']['value']) + transceiver_dom_info_dict['tx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TXPower']['value']) + + transceiver_dom_info_dict['rx_los'] = self.get_rx_los() + transceiver_dom_info_dict['tx_disable'] = self.get_tx_disable() + transceiver_dom_info_dict['tx_disabled_channel'] = self.get_tx_disable_channel() + transceiver_dom_info_dict['tx_fault'] = self.get_tx_fault() + transceiver_dom_info_dict['reset_status'] = self.get_reset_status() + transceiver_dom_info_dict['lp_mode'] = self.get_lpmode() + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict = dict.fromkeys( + self.threshold_dict_keys, 'N/A') + + if self.sfp_type == OSFP_TYPE: + pass + + elif self.sfp_type == QSFP_TYPE: + if not self.dom_supported or not self.qsfp_page3_available: + return transceiver_dom_threshold_info_dict + + # Dom Threshold data starts from offset 384 + # Revert offset back to 0 once data is retrieved + offset = QSFP_MODULE_UPPER_PAGE3_START + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values( + dom_module_threshold_raw, 0) + + dom_channel_threshold_raw = self.__read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), + QSFP_CHANNL_THRESHOLD_WIDTH) + if dom_channel_threshold_raw is None: + return transceiver_dom_threshold_info_dict + dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values( + dom_channel_threshold_raw, 0) + + # Threshold Data + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] + + else: + offset = SFP_MODULE_ADDRA2_OFFSET + + if not self.dom_supported: + return transceiver_dom_threshold_info_dict + + sfpd_obj = sff8472Dom(None, self.calibration) + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes((offset + SFP_MODULE_THRESHOLD_OFFSET), + SFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is not None: + dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold( + dom_module_threshold_raw, 0) + else: + return transceiver_dom_threshold_info_dict + + # Threshold Data + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data[ + 'data']['VoltageHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VoltageLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['BiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['BiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TXPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] + + for key in transceiver_dom_threshold_info_dict: + transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num( + transceiver_dom_threshold_info_dict[key]) + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + + port_reset_path = self.RESET_PATH.format(self.port_num) + reset_status_raw = self._api_helper.read_txt_file(port_reset_path).rstrip() + if not reset_status_raw: + return False + + return reset_status_raw == '0' + + def get_rx_los(self): + """ + Retrieves the RX LOS (loss-of-signal) status of SFP + Returns: + A list of boolean values, representing the RX LOS status + of each available channel, value is True if SFP channel + has RX LOS, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + rx_los = [] + if self.sfp_type == OSFP_TYPE: + return False + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx1_los = (rx_los_data & 0x01 != 0) + rx2_los = (rx_los_data & 0x02 != 0) + rx3_los = (rx_los_data & 0x04 != 0) + rx4_los = (rx_los_data & 0x08 != 0) + rx_los = [rx1_los, rx2_los, rx3_los, rx4_los] + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los = [(rx_los_data & 0x02 != 0)] + + return rx_los + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + Returns: + A list of boolean values, representing the TX fault status + of each available channel, value is True if SFP channel + has TX fault, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault = [] + + if self.sfp_type == OSFP_TYPE or not self.dom_supported: + return False + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx1_fault = (tx_fault_data & 0x01 != 0) + tx2_fault = (tx_fault_data & 0x02 != 0) + tx3_fault = (tx_fault_data & 0x04 != 0) + tx4_fault = (tx_fault_data & 0x08 != 0) + tx_fault = [tx1_fault, tx2_fault, tx3_fault, tx4_fault] + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault = [(tx_fault_data & 0x04 != 0)] + + return tx_fault + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + Returns: + A list of boolean values, representing the TX disable status + of each available channel, value is True if SFP channel + is TX disabled, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + """ + + tx_disable = [] + + if self.sfp_type == OSFP_TYPE and not self.dom_supported: + return False + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx1_disable = (tx_disable_data & 0x01 != 0) + tx2_disable = (tx_disable_data & 0x02 != 0) + tx3_disable = (tx_disable_data & 0x04 != 0) + tx4_disable = (tx_disable_data & 0x08 != 0) + tx_disable = [tx1_disable, tx2_disable, tx3_disable, tx4_disable] + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable = [(tx_disable_data & 0xC0 != 0)] + + return tx_disable + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + tx_disable_list = [False, False, False, False] + + if self.sfp_type == OSFP_TYPE: + pass + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list[0] = (tx_disable_data & 0x01 != 0) + tx_disable_list[1] = (tx_disable_data & 0x02 != 0) + tx_disable_list[2] = (tx_disable_data & 0x04 != 0) + tx_disable_list[3] = (tx_disable_data & 0x08 != 0) + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list[0] = (tx_disable_data & 0xC0 != 0) + + tx_disabled = 0 + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disabled |= 1 << i + return tx_disabled + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + try: + port_lpmode_path = self.LP_PATH.format(self.port_num) + reg_file = open(port_lpmode_path, "r") + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # LPMode is active high + if content == "0": + return False + + return True + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + if self.sfp_type == QSFP_TYPE: + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes( + dom_control_raw, 0) + power_override = ( + 'On' == dom_control_data['data']['PowerOverride']['value']) + return power_override + else: + return False + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + Returns: + An integer number of current temperature in Celsius + """ + transceiver_bulk_status = self.get_transceiver_bulk_status() + return transceiver_bulk_status.get("temperature", "N/A") + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + Returns: + An integer number of supply voltage in mV + """ + transceiver_bulk_status = self.get_transceiver_bulk_status() + return transceiver_bulk_status.get("voltage", "N/A") + + def get_tx_bias(self): + """ + Retrieves the TX bias current of all SFP channels + Returns: + A list of floats, representing TX bias in mA + for each available channel + E.g., for a tranceiver with four channels: ['110.09', '111.12', '108.21', '112.09'] + """ + transceiver_bulk_status = self.get_transceiver_bulk_status() + tx1_bs = transceiver_bulk_status.get("tx1bias", "N/A") + tx2_bs = transceiver_bulk_status.get("tx2bias", "N/A") + tx3_bs = transceiver_bulk_status.get("tx3bias", "N/A") + tx4_bs = transceiver_bulk_status.get("tx4bias", "N/A") + tx_bias_list = [tx1_bs, tx2_bs, tx3_bs, tx4_bs] + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power of all SFP channels + Returns: + A list of floats, representing received optical + power in mW for each available channel + E.g., for a tranceiver with four channels: ['1.77', '1.71', '1.68', '1.70'] + """ + rx_power_list = [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + rx1_p = transceiver_bulk_status.get("rx1power", "N/A") + rx2_p = transceiver_bulk_status.get("rx2power", "N/A") + rx3_p = transceiver_bulk_status.get("rx3power", "N/A") + rx4_p = transceiver_bulk_status.get("rx4power", "N/A") + rx_power_list = [rx1_p, rx2_p, rx3_p, rx4_p] + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of all SFP channels + Returns: + A list of floats, representing TX power in mW + for each available channel + E.g., for a tranceiver with four channels: ['1.86', '1.86', '1.86', '1.86'] + """ + tx_power_list = [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + tx1_p = transceiver_bulk_status.get("tx1power", "N/A") + tx2_p = transceiver_bulk_status.get("tx2power", "N/A") + tx3_p = transceiver_bulk_status.get("tx3power", "N/A") + tx4_p = transceiver_bulk_status.get("tx4power", "N/A") + tx_power_list = [tx1_p, tx2_p, tx3_p, tx4_p] + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # Check for invalid port_num + + try: + port_reset_path = self.RESET_PATH.format(self.port_num) + reg_file = open(port_reset_path, "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(0)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(port_reset_path, "w") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + reg_file.seek(0) + reg_file.write(hex(1)) + reg_file.close() + + reset_status_raw = self.__read_eeprom_specific_bytes(QSFP_RESET_STATUS_OFFSET, QSFP_RESET_STATUS_WIDTH) + reset_status_data = int(reset_status_raw[0], 16) + + if reset_status_data: + return (reset_status_data & 0x01 != 0) + else: + return False + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + if self.sfp_type == QSFP_TYPE: + try: + tx_disable_ctl = 0xf if tx_disable else 0x0 + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + with open(self.port_to_eeprom_mapping[self.port_num], "r+b") as sysfsfile_eeprom: + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + return True + except IOError as e: + # print("Error: unable to open file: %s" % str(e)) + return False + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + if self.sfp_type == QSFP_TYPE: + channel_state = self.get_tx_disable_channel() + tx_disable_ctl = channel_state + tx_enable_mask = [0xe, 0xd, 0xb, 0x7] + tx_disable_mask = [0x1, 0x2, 0x4, 0x8] + # 4 channels 3,2,1,0 + for i in range(3, -1, -1): + if ((channel >> i) & 0x01) > 0: + tx_disable_ctl = tx_disable_ctl | tx_disable_mask[i] if disable else tx_disable_ctl & tx_enable_mask[i] + + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + try: + with open(self.port_to_eeprom_mapping[self.port_num], "r+b") as sysfsfile_eeprom: + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + return True + except IOError as e: + #print("Error: unable to open file: %s" % str(e)) + return False + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + try: + port_lpmode_path = self.LP_PATH.format(self.port_num) + reg_file = open(port_lpmode_path, "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # LPMode is active high; set or clear the bit accordingly + content = "1" if lpmode else "0" + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + if self.sfp_type == QSFP_TYPE: + try: + power_override_bit = 0 + if power_override: + power_override_bit |= 1 << 0 + + power_set_bit = 0 + if power_set: + power_set_bit |= 1 << 1 + + buffer = create_string_buffer(1) + buffer[0] = chr(power_override_bit | power_set_bit) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + #print("Error: unable to open file: %s" % str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + return False + + ############################################################## + ###################### Device methods ######################## + ############################################################## + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + sfputil_helper = SfpUtilHelper() + sfputil_helper.read_porttab_mappings( + self.__get_path_to_port_config_file()) + name = sfputil_helper.logical[self.index] or "Unknown" + return name + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + if self.port_num >= QSFP_PORT_START and self.port_num <= QSFP_PORT_END: + port_present_path = self.QSFP_PRS_PATH.format(self.port_num) + elif self.port_num >= SFP_PORT_START and self.port_num <= SFP_PORT_END: + port_present_path = self.SFP_PRS_PATH.format(self.port_num - SFP_PORT_START) + else: + print("Out of SFP range {} - {}".format(PORT_START, PORT_END)) + return False + presence_status_raw = self._api_helper.read_txt_file(port_present_path).rstrip() + if not presence_status_raw: + return False + + # ModPrsL is active low + if presence_status_raw == '0': + return True + + return False + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("model", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("serial", "N/A") + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() and not self.get_reset_status() diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal.py new file mode 100644 index 00000000000..9fbdef604a6 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal.py @@ -0,0 +1,310 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path + +try: + from sonic_platform_base.thermal_base import ThermalBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PLATFORM_CPLD_PATH = '/sys/devices/platform/sys_cpld' +GETREG_FILE = 'getreg' + +FAN_DIRECTION_REG1 = '0xA141' +FAN_DIRECTION_REG2 = '0xA145' +FAN_DIRECTION_REG3 = '0xA149' +FAN_DIRECTION_REG4 = '0xA14D' + + +NULL_VAL = "N/A" +I2C_ADAPTER_PATH = "/sys/class/i2c-adapter" +IPMI_SENSOR_TEMP_CMD = "ipmitool sensor | grep degrees" +FANSHOW_CMD = "show platform fan" +THERMAL_INFO = [ + {'name': 'CPU_TEMP', 'temp': 'na'}, # 0 + {'name': 'TEMP_BB_U3', 'temp': 'na'}, # 1 + {'name': 'TEMP_SW_U25', 'temp': 'na'}, # 2 + {'name': 'TEMP_SW_U26', 'temp': 'na'}, # 3 + {'name': 'TEMP_SW_U16', 'temp': 'na'}, # 4 + {'name': 'TEMP_SW_U52', 'temp': 'na'}, # 5 + {'name': 'TEMP_SW_CORE', 'temp': 'na'}, # 6 + {'name': 'PSU1_Temp1', 'temp': 'na'}, # 7 + {'name': 'PSU1_Temp2', 'temp': 'na'}, # 8 + {'name': 'PSU1_Temp3', 'temp': 'na'}, # 9 + {'name': 'PSU2_Temp1', 'temp': 'na'}, # 10 + {'name': 'PSU2_Temp2', 'temp': 'na'}, # 11 + {'name': 'PSU2_Temp3', 'temp': 'na'}, # 12 + {'name': 'XP3R3V_LEFT_T', 'temp': 'na'}, # 13 + {'name': 'XP3R3V_RIGHT_T', 'temp': 'na'}, # 14 + {'name': 'U3P1_AVDD_T', 'temp': 'na'}, # 15 + {'name': 'XP0R8V_VDD_T', 'temp': 'na'}, # 16 + {'name': 'DIMMB0_TEMP', 'temp': 'na'}, # 17 +] + +thermal_temp_dict = { + "CPU_TEMP": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": 103, "high_critical_threshold": 105}, + "TEMP_BB_U3": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 55, "F2B": NULL_VAL}, "high_critical_threshold": {"B2F": 60, "F2B": NULL_VAL}}, + "TEMP_SW_U25": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "TEMP_SW_U26": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "TEMP_SW_U16": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": NULL_VAL, "F2B": 55}, + "high_critical_threshold": {"B2F": NULL_VAL, "F2B": 60}}, + "TEMP_SW_U52": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "TEMP_SW_CORE": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 105, "high_critical_threshold": 110}, + "PSU1_Temp1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 61, "F2B": 61}, "high_critical_threshold": NULL_VAL}, + "PSU1_Temp2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 107, "F2B": 108}, "high_critical_threshold": NULL_VAL}, + "PSU1_Temp3": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 106, "F2B": 91}, "high_critical_threshold": NULL_VAL}, + "PSU2_Temp1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 61, "F2B": 61}, "high_critical_threshold": NULL_VAL}, + "PSU2_Temp2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 107, "F2B": 108}, "high_critical_threshold": NULL_VAL}, + "PSU2_Temp3": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 106, "F2B": 91}, "high_critical_threshold": NULL_VAL}, + "XP3R3V_LEFT_T": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 125, "F2B": 125}, "high_critical_threshold": NULL_VAL}, + "XP3R3V_RIGHT_T": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 125, "F2B": 125}, "high_critical_threshold": NULL_VAL}, + "U3P1_AVDD_T": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 125, "F2B": 125}, "high_critical_threshold": NULL_VAL}, + "XP0R8V_VDD_T": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 125, "F2B": 125}, "high_critical_threshold": NULL_VAL}, + "DIMMB0_TEMP": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 85, "F2B": 85}, "high_critical_threshold": NULL_VAL}, +} + + + +temp_result = [] +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + SS_CONFIG_PATH = "/usr/share/sonic/device/x86_64-cel_midstone-100x-r0/sonic_platform/sensors.conf" + + def __init__(self, thermal_index, airflow): + + self.index = thermal_index + self._api_helper = APIHelper() + self._airflow = self.__get_fan_direction() + self._thermal_info = THERMAL_INFO[self.index] + self.name = self.get_name() + + def __get_fan_direction(self): + """ + Complete other path information according to the corresponding BUS path + """ + self.getreg_path = os.path.join(PLATFORM_CPLD_PATH, GETREG_FILE) + b2f = f2b = 0 + for i in range(1,5): + value = self._api_helper.get_cpld_reg_value( + self.getreg_path, eval('FAN_DIRECTION_REG'+str(i))) + if int(value,16) & 0x8 : + b2f = b2f + 1 + else: + f2b = f2b + 1 + + airflow = "B2F" if b2f > f2b else "F2B" + return airflow + + def __get_thermal_info(self): + """ + Complete other path information according to the corresponding BUS path + """ + global temp_result + + if self.index == 0: + status, temp_result_str = self._api_helper.run_command(IPMI_SENSOR_TEMP_CMD) + temp_result = temp_result_str.split('\n') + + for i in temp_result: + if '|' not in i: + continue + sigle_list = i.split('|') + if self._thermal_info["name"] == sigle_list[0].strip(): + self._thermal_info["temp"] = sigle_list[1].strip() + break + return True + + def __set_threshold(self, temperature): + temp_file_path = self._thermal_info.get("max_temp", "N/A") + try: + with open(temp_file_path, 'w') as fd: + fd.write(str(temperature)) + return True + except IOError: + return False + + 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 + """ + self.__get_thermal_info() + temperature = self._thermal_info.get("temp", "na") + if temperature != "na": + temperature = float(temperature) + else: + temperature = 0 + return float("{:.3f}".format(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 + """ + high_threshold = thermal_temp_dict.get(self.name).get("max") + if isinstance(high_threshold, dict): + high_threshold = high_threshold.get(self._airflow) + if high_threshold != NULL_VAL: + high_threshold = float("{:.3f}".format(high_threshold)) + return 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 + """ + low_threshold = thermal_temp_dict.get(self.name).get("min") + if low_threshold != NULL_VAL: + low_threshold = float("{:.3f}".format(low_threshold)) + return low_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 + """ + #temp_file = "temp1_max" + #is_set = self.__set_threshold(int(temperature) * 1000) + #file_set = False + #if is_set: + # try: + # with open(self.SS_CONFIG_PATH, 'r+') as f: + # content = f.readlines() + # f.seek(0) + # ss_found = False + # for idx, val in enumerate(content): + # if self.name in val: + # ss_found = True + # elif ss_found and temp_file in val: + # content[idx] = " set {} {}\n".format( + # temp_file, temperature) + # f.writelines(content) + # file_set = True + # break + # except IOError: + # file_set = False + + #return is_set & file_set + # Not Support + return False + + @staticmethod + def set_low_threshold(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 + """ + # Not Support + return False + + 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 + """ + high_critical_threshold = thermal_temp_dict.get(self.name).get("high_critical_threshold") + if isinstance(high_critical_threshold, dict): + high_critical_threshold = high_critical_threshold.get(str(self._airflow).upper()) + if high_critical_threshold != NULL_VAL: + high_critical_threshold = float("{:.3f}".format(float(high_critical_threshold))) + return high_critical_threshold + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + low_critical_threshold = thermal_temp_dict.get(self.name).get("low_critical_threshold") + if low_critical_threshold != NULL_VAL: + low_critical_threshold = float("{:.3f}".format(float(low_critical_threshold))) + return low_critical_threshold + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return self._thermal_info.get("name") + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return True if self.get_temperature() >= 0 else False + + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._thermal_info.get("model", NULL_VAL) + + @staticmethod + def get_serial(): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return NULL_VAL + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + return True diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_actions.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_actions.py new file mode 100644 index 00000000000..545db861f68 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_actions.py @@ -0,0 +1,78 @@ + +from sonic_platform_base.sonic_thermal_control.thermal_action_base import ThermalPolicyActionBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object +from .thermal_infos import ChassisInfo +from .helper import APIHelper + + +@thermal_json_object('thermal_control.control') +class ControlThermalAlgoAction(ThermalPolicyActionBase): + """ + Action to control the thermal control algorithm + """ + # JSON field definition + JSON_FIELD_STATUS = 'status' + + def __init__(self): + self.status = True + + def load_from_json(self, json_obj): + """ + Construct ControlThermalAlgoAction via JSON. JSON example: + { + "type": "thermal_control.control" + "status": "true" + } + :param json_obj: A JSON object representing a ControlThermalAlgoAction action. + :return: + """ + if ControlThermalAlgoAction.JSON_FIELD_STATUS in json_obj: + status_str = json_obj[ControlThermalAlgoAction.JSON_FIELD_STATUS].lower() + if status_str == 'true': + self.status = True + elif status_str == 'false': + self.status = False + else: + raise ValueError('Invalid {} field value, please specify true of false'. + format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) + else: + raise ValueError('ControlThermalAlgoAction ' + 'missing mandatory field {} in JSON policy file'. + format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) + + def execute(self, thermal_info_dict): + """ + Disable thermal control algorithm + :param thermal_info_dict: A dictionary stores all thermal information. + :return: + """ + if ChassisInfo.INFO_NAME in thermal_info_dict: + chassis_info_obj = thermal_info_dict[ChassisInfo.INFO_NAME] + chassis = chassis_info_obj.get_chassis() + thermal_manager = chassis.get_thermal_manager() + if self.status: + thermal_manager.start_thermal_control_algorithm() + else: + thermal_manager.stop_thermal_control_algorithm() + + +@thermal_json_object('switch.power_cycling') +class SwitchPolicyAction(ThermalPolicyActionBase): + """ + Base class for thermal action. Once all thermal conditions in a thermal policy are matched, + all predefined thermal action will be executed. + """ + + def execute(self, thermal_info_dict): + """ + Take action when thermal condition matches. For example, power cycle the switch. + :param thermal_info_dict: A dictionary stores all thermal information. + :return: + """ + thermal_overload_position_path = '/tmp/thermal_overload_position' + thermal_overload_position = APIHelper().read_one_line_file( + thermal_overload_position_path) + + cmd = 'bash /usr/share/sonic/platform/thermal_overload_control.sh {}'.format( + thermal_overload_position) + APIHelper().run_command(cmd) diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_conditions.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_conditions.py new file mode 100644 index 00000000000..1eee8ea91ab --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_conditions.py @@ -0,0 +1,77 @@ +from sonic_platform_base.sonic_thermal_control.thermal_condition_base import ThermalPolicyConditionBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object + + +class FanCondition(ThermalPolicyConditionBase): + def get_fan_info(self, thermal_info_dict): + from .thermal_infos import FanInfo + if FanInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[FanInfo.INFO_NAME], FanInfo): + return thermal_info_dict[FanInfo.INFO_NAME] + else: + return None + + +@thermal_json_object('fan.any.absence') +class AnyFanAbsenceCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_absence_fans()) > 0 if fan_info_obj else False + + +@thermal_json_object('fan.any.fault') +class AnyFanFaultCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_fault_fans()) > 0 if fan_info_obj else False + + +@thermal_json_object('fan.all.presence') +class AllFanPresenceCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_absence_fans()) == 0 if fan_info_obj else False + + +@thermal_json_object('fan.all.good') +class AllFanGoodCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_fault_fans()) == 0 if fan_info_obj else False + + +class ThermalCondition(ThermalPolicyConditionBase): + def get_thermal_info(self, thermal_info_dict): + from .thermal_infos import ThermalInfo + if ThermalInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo): + return thermal_info_dict[ThermalInfo.INFO_NAME] + else: + return None + + +@thermal_json_object('thermal.over.high_threshold') +class ThermalOverHighCriticalCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return thermal_info_obj.is_over_high_threshold() + else: + return False + + +@thermal_json_object('thermal.over.high_critical_threshold') +class ThermalOverHighCriticalCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return thermal_info_obj.is_over_high_critical_threshold() + else: + return False + +@thermal_json_object('thermal.all.good') +class ThermalGoodCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return not thermal_info_obj.is_over_threshold() + else: + return False diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_infos.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_infos.py new file mode 100644 index 00000000000..a680b31b634 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_infos.py @@ -0,0 +1,165 @@ +from sonic_platform_base.sonic_thermal_control.thermal_info_base import ThermalPolicyInfoBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object +from .helper import APIHelper +import time + + +@thermal_json_object('fan_info') +class FanInfo(ThermalPolicyInfoBase): + """ + Fan information needed by thermal policy + """ + + # Fan information name + INFO_NAME = 'fan_info' + + def __init__(self): + self._absence_fans = set() + self._presence_fans = set() + self._fault_fans = set() + self._status_changed = False + + def collect(self, chassis): + """ + Collect absence and presence fans. + :param chassis: The chassis object + :return: + """ + self._status_changed = False + for fan in chassis.get_all_fans(): + presence = fan.get_presence() + status = fan.get_status() + if presence and fan not in self._presence_fans: + self._presence_fans.add(fan) + self._status_changed = True + if fan in self._absence_fans: + self._absence_fans.remove(fan) + elif not presence and fan not in self._absence_fans: + self._absence_fans.add(fan) + self._status_changed = True + if fan in self._presence_fans: + self._presence_fans.remove(fan) + + if not status and fan not in self._fault_fans: + self._fault_fans.add(fan) + self._status_changed = True + + elif status and fan in self._fault_fans: + self._fault_fans.remove(fan) + self._status_changed = True + + def get_absence_fans(self): + """ + Retrieves absence fans + :return: A set of absence fans + """ + return self._absence_fans + + def get_presence_fans(self): + """ + Retrieves presence fans + :return: A set of presence fans + """ + return self._presence_fans + + def get_fault_fans(self): + """ + Retrieves fault fans + :return: A set of fault fans + """ + return self._fault_fans + + def is_status_changed(self): + """ + Retrieves if the status of fan information changed + :return: True if status changed else False + """ + return self._status_changed + + +@thermal_json_object('thermal_info') +class ThermalInfo(ThermalPolicyInfoBase): + """ + Thermal information needed by thermal policy + """ + + # Fan information name + INFO_NAME = 'thermal_info' + + def collect(self, chassis): + """ + Collect thermal sensor temperature change status + :param chassis: The chassis object + :return: + """ + self._over_high_threshold = False + self._over_high_critical_threshold = False + self._thermal_overload_position = 'cpu' + + # Calculate average temp within the device + temp = 0 + num_of_thermals = chassis.get_num_thermals() + for index in range(num_of_thermals): + thermal = chassis.get_thermal(index) + temp = thermal.get_temperature() + high_threshold = thermal.get_high_threshold() + high_critical_threshold = thermal.get_high_critical_threshold() + + if high_threshold and temp > high_threshold: + self._over_high_threshold = True + + if high_critical_threshold and temp > high_critical_threshold: + self._thermal_overload_position = thermal.postion + self._over_high_critical_threshold = True + + def is_over_threshold(self): + """ + Retrieves if the temperature is over any threshold + :return: True if the temperature is over any threshold else False + """ + return self._over_high_threshold or self._over_high_critical_threshold + + def is_over_high_critical_threshold(self): + """ + Retrieves if the temperature is over high critical threshold + :return: True if the temperature is over high critical threshold else False + """ + thermal_overload_position_path = '/tmp/thermal_overload_position' + if self._over_high_critical_threshold: + APIHelper().write_txt_file(thermal_overload_position_path, + self._thermal_overload_position) + time.sleep(1) + return self._over_high_critical_threshold + + def is_over_high_threshold(self): + """ + Retrieves if the temperature is over high threshold + :return: True if the temperature is over high threshold else False + """ + return self._over_high_threshold + + +@thermal_json_object('chassis_info') +class ChassisInfo(ThermalPolicyInfoBase): + """ + Chassis information needed by thermal policy + """ + INFO_NAME = 'chassis_info' + + def __init__(self): + self._chassis = None + + def collect(self, chassis): + """ + Collect platform chassis. + :param chassis: The chassis object + :return: + """ + self._chassis = chassis + + def get_chassis(self): + """ + Retrieves platform chassis object + :return: A platform chassis object. + """ + return self._chassis diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_manager.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_manager.py new file mode 100644 index 00000000000..95b3f48f966 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/thermal_manager.py @@ -0,0 +1,43 @@ +from sonic_platform_base.sonic_thermal_control.thermal_manager_base import ThermalManagerBase +from .helper import APIHelper + +class ThermalManager(ThermalManagerBase): + FSC_ALGORITHM_CMD = 'service fancontrol {}' + + @classmethod + def start_thermal_control_algorithm(cls): + """ + Start vendor specific thermal control algorithm. The default behavior of this function is a no-op. + :return: + """ + return cls._enable_fancontrol_service(True) + + @classmethod + def stop_thermal_control_algorithm(cls): + """ + Stop thermal control algorithm + Returns: + bool: True if set success, False if fail. + """ + return cls._enable_fancontrol_service(False) + + @classmethod + def deinitialize(cls): + """ + Destroy thermal manager, including any vendor specific cleanup. The default behavior of this function + is a no-op. + :return: + """ + return cls._enable_fancontrol_service(True) + + @classmethod + def _enable_fancontrol_service(cls, enable): + """ + Control thermal by fcs algorithm + Args: + enable: Bool, indicate enable the algorithm or not + Returns: + bool: True if set success, False if fail. + """ + cmd = 'start' if enable else 'stop' + return APIHelper().run_command(cls.FSC_ALGORITHM_CMD.format(cmd)) diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/watchdog.py b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/watchdog.py new file mode 100644 index 00000000000..5c5fa33398a --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/sonic_platform/watchdog.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Watchdog contains an implementation of SONiC Platform Base API +# +############################################################################# +import os +import time + +try: + from sonic_platform_base.watchdog_base import WatchdogBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PLATFORM_CPLD_PATH = '/sys/devices/platform/sys_cpld' +GETREG_FILE = 'getreg' +SETREG_FILE = 'setreg' +WDT_ENABLE_REG = '0xA187' +WDT_SET_TIMER_L_BIT_REG = '0xA183' +WDT_SET_TIMER_M_BIT_REG = '0xA182' +WDT_SET_TIMER_H_BIT_REG = '0xA181' + +WDT_TIMER_L_BIT_REG = '0xA186' +WDT_TIMER_M_BIT_REG = '0xA185' +WDT_TIMER_H_BIT_REG = '0xA184' + +WDT_KEEP_ALVIVE_REG = '0xA188' +ENABLE_CMD = '0x1' +DISABLE_CMD = '0x0' +WDT_COMMON_ERROR = -1 + + +class Watchdog(WatchdogBase): + def __init__(self): + # Init helper + self._api_helper = APIHelper() + + # Init cpld reg path + self.setreg_path = os.path.join(PLATFORM_CPLD_PATH, SETREG_FILE) + self.getreg_path = os.path.join(PLATFORM_CPLD_PATH, GETREG_FILE) + + # Set default value + #self._disable() + #self.armed = False + value = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_ENABLE_REG) + hex_time = '{}'.format(value) + value = int(hex_time, 16) + self.armed = True if value else False + self.timeout = self._gettimeout() + self.arm_timestamp = 0 + + def _enable(self): + """ + Turn on the watchdog timer + """ + # echo 0xA187 0x1 > /sys/devices/platform/sys_cpld/setreg + enable_val = '{} {}'.format(WDT_ENABLE_REG, ENABLE_CMD) + return self._api_helper.write_txt_file(self.setreg_path, enable_val) + + def _disable(self): + """ + Turn off the watchdog timer + """ + # echo 0xA187 0x0 > /sys/devices/platform/sys_cpld/setreg + disable_val = '{} {}'.format(WDT_ENABLE_REG, DISABLE_CMD) + return self._api_helper.write_txt_file(self.setreg_path, disable_val) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + + # echo 0xA188 > /sys/devices/platform/sys_cpld/getreg + # value = $(cat /sys/devices/platform/sys_cpld/getreg) + # echo 0xA188 (~ $value) & 0x01 > /sys/devices/platform/sys_cpld/setreg + + value = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_KEEP_ALVIVE_REG) + value = int(value, 16) + enable_val = '{} 0x{}'.format(WDT_KEEP_ALVIVE_REG, (~value) & 0x01) + return self._api_helper.write_txt_file(self.setreg_path, enable_val) + + def _get_level_hex(self, sub_hex): + sub_hex_str = sub_hex.replace("x", "0") + return hex(int(sub_hex_str, 16)) + + def _seconds_to_lmh_hex(self, seconds): + ms = seconds*1000 # calculate timeout in ms format + hex_str = hex(ms) + l = self._get_level_hex(hex_str[-2:]) + m = self._get_level_hex(hex_str[-4:-2]) + h = self._get_level_hex(hex_str[-6:-4]) + return (l, m, h) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + # max = 0xffffff = 16777.215 seconds + + (l, m, h) = self._seconds_to_lmh_hex(seconds) + set_h_val = '{} {}'.format(WDT_SET_TIMER_H_BIT_REG, h) + set_m_val = '{} {}'.format(WDT_SET_TIMER_M_BIT_REG, m) + set_l_val = '{} {}'.format(WDT_SET_TIMER_L_BIT_REG, l) + + self._api_helper.write_txt_file(self.setreg_path, set_h_val) + self._api_helper.write_txt_file(self.setreg_path, set_m_val) + self._api_helper.write_txt_file(self.setreg_path, set_l_val) + + return seconds + + def _gettimeout(self): + """ + Get watchdog timeout + @return watchdog timeout + """ + + h_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_SET_TIMER_H_BIT_REG) + m_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_SET_TIMER_M_BIT_REG) + l_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_SET_TIMER_L_BIT_REG) + + hex_time = '0x{}{}{}'.format(h_bit[2:], m_bit[2:], l_bit[2:]) + ms = int(hex_time, 16) + return int(float(ms)/1000) + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of 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 , 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. + """ + + ret = WDT_COMMON_ERROR + if seconds < 0 or seconds > int(0xffffff/1000): + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + + if self.armed: + self._keepalive() + else: + self._enable() + self._keepalive() + self.armed = True + + ret = self.timeout + self.arm_timestamp = time.time() + except IOError as e: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + return self.armed + + 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 thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + h_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_H_BIT_REG) + m_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_M_BIT_REG) + l_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_L_BIT_REG) + + hex_time = '0x{}{}{}'.format(h_bit[2:], m_bit[2:], l_bit[2:]) + ms = int(hex_time, 16) + return int(float(ms)/1000) if self.armed else WDT_COMMON_ERROR diff --git a/device/celestica/x86_64-cel_midstone-100x-r0/topo.conf b/device/celestica/x86_64-cel_midstone-100x-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-100x-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 index 45cebf3b714..93dac6b1992 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 64 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml index 0b7e1a2db9d..74baab51f05 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml @@ -4,12 +4,18 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + pcie_attn: "14" + pcie_post: "18" + pcie_pre1: "0" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -57,452 +63,452 @@ nodes: sysport: "128" type: "cpu" - fec: "KRFEC" - id: "1" + id: "249" lanes: "0:4" serdes_group: "31" speed: "100G" - sysport: "1" + sysport: "249" type: "eth" - fec: "KRFEC" - id: "2" + id: "253" lanes: "4:4" serdes_group: "31" speed: "100G" - sysport: "2" + sysport: "253" type: "eth" - fec: "KRFEC" - id: "3" + id: "245" lanes: "4:4" serdes_group: "30" speed: "100G" - sysport: "3" + sysport: "245" type: "eth" - fec: "KRFEC" - id: "4" + id: "241" lanes: "0:4" serdes_group: "30" speed: "100G" - sysport: "4" + sysport: "241" type: "eth" - fec: "KRFEC" - id: "5" + id: "233" lanes: "0:4" serdes_group: "29" speed: "100G" - sysport: "5" + sysport: "233" type: "eth" - fec: "KRFEC" - id: "6" + id: "237" lanes: "4:4" serdes_group: "29" speed: "100G" - sysport: "6" + sysport: "237" type: "eth" - fec: "KRFEC" - id: "7" + id: "229" lanes: "4:4" serdes_group: "28" speed: "100G" - sysport: "7" + sysport: "229" type: "eth" - fec: "KRFEC" - id: "8" + id: "225" lanes: "0:4" serdes_group: "28" speed: "100G" - sysport: "8" + sysport: "225" type: "eth" - fec: "KRFEC" - id: "9" + id: "217" lanes: "0:4" serdes_group: "27" speed: "100G" - sysport: "9" + sysport: "217" type: "eth" - fec: "KRFEC" - id: "10" + id: "221" lanes: "4:4" serdes_group: "27" speed: "100G" - sysport: "10" + sysport: "221" type: "eth" - fec: "KRFEC" - id: "11" + id: "213" lanes: "4:4" serdes_group: "26" speed: "100G" - sysport: "11" + sysport: "213" type: "eth" - fec: "KRFEC" - id: "12" + id: "209" lanes: "0:4" serdes_group: "26" speed: "100G" - sysport: "12" + sysport: "209" type: "eth" - fec: "KRFEC" - id: "13" + id: "201" lanes: "0:4" serdes_group: "25" speed: "100G" - sysport: "13" + sysport: "201" type: "eth" - fec: "KRFEC" - id: "14" + id: "205" lanes: "4:4" serdes_group: "25" speed: "100G" - sysport: "14" + sysport: "205" type: "eth" - fec: "KRFEC" - id: "15" + id: "197" lanes: "4:4" serdes_group: "24" speed: "100G" - sysport: "15" + sysport: "197" type: "eth" - fec: "KRFEC" - id: "16" + id: "193" lanes: "0:4" serdes_group: "24" speed: "100G" - sysport: "16" + sysport: "193" type: "eth" - fec: "KRFEC" - id: "17" + id: "185" lanes: "0:4" serdes_group: "23" speed: "100G" - sysport: "17" + sysport: "185" type: "eth" - fec: "KRFEC" - id: "18" + id: "189" lanes: "4:4" serdes_group: "23" speed: "100G" - sysport: "18" + sysport: "189" type: "eth" - fec: "KRFEC" - id: "19" + id: "181" lanes: "4:4" serdes_group: "22" speed: "100G" - sysport: "19" + sysport: "181" type: "eth" - fec: "KRFEC" - id: "20" + id: "177" lanes: "0:4" serdes_group: "22" speed: "100G" - sysport: "20" + sysport: "177" type: "eth" - fec: "KRFEC" - id: "21" + id: "169" lanes: "0:4" serdes_group: "21" speed: "100G" - sysport: "21" + sysport: "169" type: "eth" - fec: "KRFEC" - id: "22" + id: "173" lanes: "4:4" serdes_group: "21" speed: "100G" - sysport: "22" + sysport: "173" type: "eth" - fec: "KRFEC" - id: "23" + id: "165" lanes: "4:4" serdes_group: "20" speed: "100G" - sysport: "23" + sysport: "165" type: "eth" - fec: "KRFEC" - id: "24" + id: "161" lanes: "0:4" serdes_group: "20" speed: "100G" - sysport: "24" + sysport: "161" type: "eth" - fec: "KRFEC" - id: "25" + id: "153" lanes: "0:4" serdes_group: "19" speed: "100G" - sysport: "25" + sysport: "153" type: "eth" - fec: "KRFEC" - id: "26" + id: "157" lanes: "4:4" serdes_group: "19" speed: "100G" - sysport: "26" + sysport: "157" type: "eth" - fec: "KRFEC" - id: "27" + id: "149" lanes: "4:4" serdes_group: "18" speed: "100G" - sysport: "27" + sysport: "149" type: "eth" - fec: "KRFEC" - id: "28" + id: "145" lanes: "0:4" serdes_group: "18" speed: "100G" - sysport: "28" + sysport: "145" type: "eth" - fec: "KRFEC" - id: "29" + id: "137" lanes: "0:4" serdes_group: "17" speed: "100G" - sysport: "29" + sysport: "137" type: "eth" - fec: "KRFEC" - id: "30" + id: "141" lanes: "4:4" serdes_group: "17" speed: "100G" - sysport: "30" + sysport: "141" type: "eth" - fec: "KRFEC" - id: "31" + id: "133" lanes: "4:4" serdes_group: "16" speed: "100G" - sysport: "31" + sysport: "133" type: "eth" - fec: "KRFEC" - id: "32" + id: "129" lanes: "0:4" serdes_group: "16" speed: "100G" - sysport: "32" + sysport: "129" type: "eth" - fec: "KRFEC" - id: "33" + id: "121" lanes: "0:4" serdes_group: "15" speed: "100G" - sysport: "33" + sysport: "121" type: "eth" - fec: "KRFEC" - id: "34" + id: "125" lanes: "4:4" serdes_group: "15" speed: "100G" - sysport: "34" + sysport: "125" type: "eth" - fec: "KRFEC" - id: "35" + id: "117" lanes: "4:4" serdes_group: "14" speed: "100G" - sysport: "35" + sysport: "117" type: "eth" - fec: "KRFEC" - id: "36" + id: "113" lanes: "0:4" serdes_group: "14" speed: "100G" - sysport: "36" + sysport: "113" type: "eth" - fec: "KRFEC" - id: "37" + id: "105" lanes: "0:4" serdes_group: "13" speed: "100G" - sysport: "37" + sysport: "105" type: "eth" - fec: "KRFEC" - id: "38" + id: "109" lanes: "4:4" serdes_group: "13" speed: "100G" - sysport: "38" + sysport: "109" type: "eth" - fec: "KRFEC" - id: "39" + id: "101" lanes: "4:4" serdes_group: "12" speed: "100G" - sysport: "39" + sysport: "101" type: "eth" - fec: "KRFEC" - id: "40" + id: "97" lanes: "0:4" serdes_group: "12" speed: "100G" - sysport: "40" + sysport: "97" type: "eth" - fec: "KRFEC" - id: "41" + id: "89" lanes: "0:4" serdes_group: "11" speed: "100G" - sysport: "41" + sysport: "89" type: "eth" - fec: "KRFEC" - id: "42" + id: "93" lanes: "4:4" serdes_group: "11" speed: "100G" - sysport: "42" + sysport: "93" type: "eth" - fec: "KRFEC" - id: "43" + id: "85" lanes: "4:4" serdes_group: "10" speed: "100G" - sysport: "43" + sysport: "85" type: "eth" - fec: "KRFEC" - id: "44" + id: "81" lanes: "0:4" serdes_group: "10" speed: "100G" - sysport: "44" + sysport: "81" type: "eth" - fec: "KRFEC" - id: "45" + id: "73" lanes: "0:4" serdes_group: "9" speed: "100G" - sysport: "45" + sysport: "73" type: "eth" - fec: "KRFEC" - id: "46" + id: "77" lanes: "4:4" serdes_group: "9" speed: "100G" - sysport: "46" + sysport: "77" type: "eth" - fec: "KRFEC" - id: "47" + id: "69" lanes: "4:4" serdes_group: "8" speed: "100G" - sysport: "47" + sysport: "69" type: "eth" - fec: "KRFEC" - id: "48" + id: "65" lanes: "0:4" serdes_group: "8" speed: "100G" - sysport: "48" + sysport: "65" type: "eth" - fec: "KRFEC" - id: "49" + id: "57" lanes: "0:4" serdes_group: "7" speed: "100G" - sysport: "49" + sysport: "57" type: "eth" - fec: "KRFEC" - id: "50" + id: "61" lanes: "4:4" serdes_group: "7" speed: "100G" - sysport: "50" + sysport: "61" type: "eth" - fec: "KRFEC" - id: "51" + id: "53" lanes: "4:4" serdes_group: "6" speed: "100G" - sysport: "51" + sysport: "53" type: "eth" - fec: "KRFEC" - id: "52" + id: "49" lanes: "0:4" serdes_group: "6" speed: "100G" - sysport: "52" + sysport: "49" type: "eth" - fec: "KRFEC" - id: "53" + id: "41" lanes: "0:4" serdes_group: "5" speed: "100G" - sysport: "53" + sysport: "41" type: "eth" - fec: "KRFEC" - id: "54" + id: "45" lanes: "4:4" serdes_group: "5" speed: "100G" - sysport: "54" + sysport: "45" type: "eth" - fec: "KRFEC" - id: "55" + id: "37" lanes: "4:4" serdes_group: "4" speed: "100G" - sysport: "55" + sysport: "37" type: "eth" - fec: "KRFEC" - id: "56" + id: "33" lanes: "0:4" serdes_group: "4" speed: "100G" - sysport: "56" + sysport: "33" type: "eth" - fec: "KRFEC" - id: "57" + id: "25" lanes: "0:4" serdes_group: "3" speed: "100G" - sysport: "57" + sysport: "25" type: "eth" - fec: "KRFEC" - id: "58" + id: "29" lanes: "4:4" serdes_group: "3" speed: "100G" - sysport: "58" + sysport: "29" type: "eth" - fec: "KRFEC" - id: "59" + id: "21" lanes: "4:4" serdes_group: "2" speed: "100G" - sysport: "59" + sysport: "21" type: "eth" - fec: "KRFEC" - id: "60" + id: "17" lanes: "0:4" serdes_group: "2" speed: "100G" - sysport: "60" + sysport: "17" type: "eth" - fec: "KRFEC" - id: "61" + id: "9" lanes: "0:4" serdes_group: "1" speed: "100G" - sysport: "61" + sysport: "9" type: "eth" - fec: "KRFEC" - id: "62" + id: "13" lanes: "4:4" serdes_group: "1" speed: "100G" - sysport: "62" + sysport: "13" type: "eth" - fec: "KRFEC" - id: "63" + id: "5" lanes: "4:4" serdes_group: "0" speed: "100G" - sysport: "63" + sysport: "5" type: "eth" - fec: "KRFEC" - id: "64" + id: "1" lanes: "0:4" serdes_group: "0" speed: "100G" - sysport: "64" + sysport: "1" type: "eth" isg: - id: "0" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/ivm.sai.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/ivm.sai.config.yaml new file mode 100755 index 00000000000..7725af94fe2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/pg_profile_lookup.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini index c9b30d768d5..0aa3bf80203 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini @@ -1,65 +1,65 @@ # name lanes speed index mtu -Ethernet0 249,250,251,252 100000 1 9126 -Ethernet4 253,254,255,256 100000 2 9126 -Ethernet8 245,246,247,248 100000 3 9126 -Ethernet12 241,242,243,244 100000 4 9126 -Ethernet16 233,234,235,236 100000 5 9126 -Ethernet20 237,238,239,240 100000 6 9126 -Ethernet24 229,230,231,232 100000 7 9126 -Ethernet28 225,226,227,228 100000 8 9126 -Ethernet32 217,218,219,220 100000 9 9126 -Ethernet36 221,222,223,224 100000 10 9126 -Ethernet40 213,214,215,216 100000 11 9126 -Ethernet44 209,210,211,212 100000 12 9126 -Ethernet48 201,202,203,204 100000 13 9126 -Ethernet52 205,206,207,208 100000 14 9126 -Ethernet56 197,198,199,200 100000 15 9126 -Ethernet60 193,194,195,196 100000 16 9126 -Ethernet64 185,186,187,188 100000 17 9126 -Ethernet68 189,190,191,192 100000 18 9126 -Ethernet72 181,182,183,184 100000 19 9126 -Ethernet76 177,178,179,180 100000 20 9126 -Ethernet80 169,170,171,172 100000 21 9126 -Ethernet84 173,174,175,176 100000 22 9126 -Ethernet88 165,166,167,168 100000 23 9126 -Ethernet92 161,162,163,164 100000 24 9126 -Ethernet96 153,154,155,156 100000 25 9126 -Ethernet100 157,158,159,160 100000 26 9126 -Ethernet104 149,150,151,152 100000 27 9126 -Ethernet108 145,146,147,148 100000 28 9126 -Ethernet112 137,138,139,140 100000 29 9126 -Ethernet116 141,142,143,144 100000 30 9126 -Ethernet120 133,134,135,136 100000 31 9126 -Ethernet124 129,130,131,132 100000 32 9126 -Ethernet128 121,122,123,124 100000 33 9126 -Ethernet132 125,126,127,128 100000 34 9126 -Ethernet136 117,118,119,120 100000 35 9126 -Ethernet140 113,114,115,116 100000 36 9126 -Ethernet144 105,106,107,108 100000 37 9126 -Ethernet148 109,110,111,112 100000 38 9126 -Ethernet152 101,102,103,104 100000 39 9126 -Ethernet156 97,98,99,100 100000 40 9126 -Ethernet160 89,90,91,92 100000 41 9126 -Ethernet164 93,94,95,96 100000 42 9126 -Ethernet168 85,86,87,88 100000 43 9126 -Ethernet172 81,82,83,84 100000 44 9126 -Ethernet176 73,74,75,76 100000 45 9126 -Ethernet180 77,78,79,80 100000 46 9126 -Ethernet184 69,70,71,72 100000 47 9126 -Ethernet188 65,66,67,68 100000 48 9126 -Ethernet192 57,58,59,60 100000 49 9126 -Ethernet196 61,62,63,64 100000 50 9126 -Ethernet200 53,54,55,56 100000 51 9126 -Ethernet204 49,50,51,52 100000 52 9126 -Ethernet208 41,42,43,44 100000 53 9126 -Ethernet212 45,46,47,48 100000 54 9126 -Ethernet216 37,38,39,40 100000 55 9126 -Ethernet220 33,34,35,36 100000 56 9126 -Ethernet224 25,26,27,28 100000 57 9126 -Ethernet228 29,30,31,32 100000 58 9126 -Ethernet232 21,22,23,24 100000 59 9126 -Ethernet236 17,18,19,20 100000 60 9126 -Ethernet240 9,10,11,12 100000 61 9126 -Ethernet244 13,14,15,16 100000 62 9126 -Ethernet248 5,6,7,8 100000 63 9126 -Ethernet252 1,2,3,4 100000 64 9126 +Ethernet0 249,250,251,252 100000 0 9126 +Ethernet4 253,254,255,256 100000 1 9126 +Ethernet8 245,246,247,248 100000 2 9126 +Ethernet12 241,242,243,244 100000 3 9126 +Ethernet16 233,234,235,236 100000 4 9126 +Ethernet20 237,238,239,240 100000 5 9126 +Ethernet24 229,230,231,232 100000 6 9126 +Ethernet28 225,226,227,228 100000 7 9126 +Ethernet32 217,218,219,220 100000 8 9126 +Ethernet36 221,222,223,224 100000 9 9126 +Ethernet40 213,214,215,216 100000 10 9126 +Ethernet44 209,210,211,212 100000 11 9126 +Ethernet48 201,202,203,204 100000 12 9126 +Ethernet52 205,206,207,208 100000 13 9126 +Ethernet56 197,198,199,200 100000 14 9126 +Ethernet60 193,194,195,196 100000 15 9126 +Ethernet64 185,186,187,188 100000 16 9126 +Ethernet68 189,190,191,192 100000 17 9126 +Ethernet72 181,182,183,184 100000 18 9126 +Ethernet76 177,178,179,180 100000 19 9126 +Ethernet80 169,170,171,172 100000 20 9126 +Ethernet84 173,174,175,176 100000 21 9126 +Ethernet88 165,166,167,168 100000 22 9126 +Ethernet92 161,162,163,164 100000 23 9126 +Ethernet96 153,154,155,156 100000 24 9126 +Ethernet100 157,158,159,160 100000 25 9126 +Ethernet104 149,150,151,152 100000 26 9126 +Ethernet108 145,146,147,148 100000 27 9126 +Ethernet112 137,138,139,140 100000 28 9126 +Ethernet116 141,142,143,144 100000 29 9126 +Ethernet120 133,134,135,136 100000 30 9126 +Ethernet124 129,130,131,132 100000 31 9126 +Ethernet128 121,122,123,124 100000 32 9126 +Ethernet132 125,126,127,128 100000 33 9126 +Ethernet136 117,118,119,120 100000 34 9126 +Ethernet140 113,114,115,116 100000 35 9126 +Ethernet144 105,106,107,108 100000 36 9126 +Ethernet148 109,110,111,112 100000 37 9126 +Ethernet152 101,102,103,104 100000 38 9126 +Ethernet156 97,98,99,100 100000 39 9126 +Ethernet160 89,90,91,92 100000 40 9126 +Ethernet164 93,94,95,96 100000 41 9126 +Ethernet168 85,86,87,88 100000 42 9126 +Ethernet172 81,82,83,84 100000 43 9126 +Ethernet176 73,74,75,76 100000 44 9126 +Ethernet180 77,78,79,80 100000 45 9126 +Ethernet184 69,70,71,72 100000 46 9126 +Ethernet188 65,66,67,68 100000 47 9126 +Ethernet192 57,58,59,60 100000 48 9126 +Ethernet196 61,62,63,64 100000 49 9126 +Ethernet200 53,54,55,56 100000 50 9126 +Ethernet204 49,50,51,52 100000 51 9126 +Ethernet208 41,42,43,44 100000 52 9126 +Ethernet212 45,46,47,48 100000 53 9126 +Ethernet216 37,38,39,40 100000 54 9126 +Ethernet220 33,34,35,36 100000 55 9126 +Ethernet224 25,26,27,28 100000 56 9126 +Ethernet228 29,30,31,32 100000 57 9126 +Ethernet232 21,22,23,24 100000 58 9126 +Ethernet236 17,18,19,20 100000 59 9126 +Ethernet240 9,10,11,12 100000 60 9126 +Ethernet244 13,14,15,16 100000 61 9126 +Ethernet248 5,6,7,8 100000 62 9126 +Ethernet252 1,2,3,4 100000 63 9126 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 index 16f9b42a216..4b9748c7b59 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 64 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 index 9529fbf52fb..93dac6b1992 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 128 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml index 342d223a96e..ea31f498bde 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -951,20 +954,6 @@ nodes: speed: "100G" sysport: "3" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" lane_swap: "01234567" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/ivm.sai.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..ca615421d2f --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_128x100G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/pg_profile_lookup.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini index 9366905c4eb..512edc536d7 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini @@ -1,131 +1,129 @@ -# name lanes speed index mtu -Ethernet0 249,250 100000 0 9126 -Ethernet2 251,252 100000 0 9126 -Ethernet4 253,254 100000 1 9126 -Ethernet6 255,256 100000 1 9126 -Ethernet8 245,246 100000 2 9126 -Ethernet10 247,248 100000 2 9126 -Ethernet12 241,242 100000 3 9126 -Ethernet14 243,244 100000 3 9126 -Ethernet16 233,234 100000 4 9126 -Ethernet18 235,236 100000 4 9126 -Ethernet20 237,238 100000 5 9126 -Ethernet22 239,240 100000 5 9126 -Ethernet24 229,230 100000 6 9126 -Ethernet26 231,232 100000 6 9126 -Ethernet28 225,226 100000 7 9126 -Ethernet30 227,228 100000 7 9126 -Ethernet32 217,218 100000 8 9126 -Ethernet34 219,220 100000 8 9126 -Ethernet36 221,222 100000 9 9126 -Ethernet38 223,224 100000 9 9126 -Ethernet40 213,214 100000 10 9126 -Ethernet42 215,216 100000 10 9126 -Ethernet44 209,210 100000 11 9126 -Ethernet46 211,212 100000 11 9126 -Ethernet48 201,202 100000 12 9126 -Ethernet50 203,204 100000 12 9126 -Ethernet52 205,206 100000 13 9126 -Ethernet54 207,208 100000 13 9126 -Ethernet56 197,198 100000 14 9126 -Ethernet58 199,200 100000 14 9126 -Ethernet60 193,194 100000 15 9126 -Ethernet62 195,196 100000 15 9126 -Ethernet64 185,186 100000 16 9126 -Ethernet66 187,188 100000 16 9126 -Ethernet68 189,190 100000 17 9126 -Ethernet70 191,192 100000 17 9126 -Ethernet72 181,182 100000 18 9126 -Ethernet74 183,184 100000 18 9126 -Ethernet76 177,178 100000 19 9126 -Ethernet78 179,180 100000 19 9126 -Ethernet80 169,170 100000 20 9126 -Ethernet82 171,172 100000 20 9126 -Ethernet84 173,174 100000 21 9126 -Ethernet86 175,176 100000 21 9126 -Ethernet88 165,166 100000 22 9126 -Ethernet90 167,168 100000 22 9126 -Ethernet92 161,162 100000 23 9126 -Ethernet94 163,164 100000 23 9126 -Ethernet96 153,154 100000 24 9126 -Ethernet98 155,156 100000 24 9126 -Ethernet100 157,158 100000 25 9126 -Ethernet102 159,160 100000 25 9126 -Ethernet104 149,150 100000 26 9126 -Ethernet106 151,152 100000 26 9126 -Ethernet108 145,146 100000 27 9126 -Ethernet110 147,148 100000 27 9126 -Ethernet112 137,138 100000 28 9126 -Ethernet114 139,140 100000 28 9126 -Ethernet116 141,142 100000 29 9126 -Ethernet118 143,144 100000 29 9126 -Ethernet120 133,134 100000 30 9126 -Ethernet122 135,136 100000 30 9126 -Ethernet124 129,130 100000 31 9126 -Ethernet126 131,132 100000 31 9126 -Ethernet128 121,122 100000 32 9126 -Ethernet130 123,124 100000 32 9126 -Ethernet132 125,126 100000 33 9126 -Ethernet134 127,128 100000 33 9126 -Ethernet136 117,118 100000 34 9126 -Ethernet138 119,120 100000 34 9126 -Ethernet140 113,114 100000 35 9126 -Ethernet142 115,116 100000 35 9126 -Ethernet144 105,106 100000 36 9126 -Ethernet146 107,108 100000 36 9126 -Ethernet148 109,110 100000 37 9126 -Ethernet150 111,112 100000 37 9126 -Ethernet152 101,102 100000 38 9126 -Ethernet154 103,104 100000 38 9126 -Ethernet156 97,98 100000 39 9126 -Ethernet158 99,100 100000 39 9126 -Ethernet160 89,90 100000 40 9126 -Ethernet162 91,92 100000 40 9126 -Ethernet164 93,94 100000 41 9126 -Ethernet166 95,96 100000 41 9126 -Ethernet168 85,86 100000 42 9126 -Ethernet170 87,88 100000 42 9126 -Ethernet172 81,82 100000 43 9126 -Ethernet174 83,84 100000 43 9126 -Ethernet176 73,74 100000 44 9126 -Ethernet178 75,76 100000 44 9126 -Ethernet180 77,78 100000 45 9126 -Ethernet182 79,80 100000 45 9126 -Ethernet184 69,70 100000 46 9126 -Ethernet186 71,72 100000 46 9126 -Ethernet188 65,66 100000 47 9126 -Ethernet190 67,68 100000 47 9126 -Ethernet192 57,58 100000 48 9126 -Ethernet194 59,60 100000 48 9126 -Ethernet196 61,62 100000 49 9126 -Ethernet198 63,64 100000 49 9126 -Ethernet200 53,54 100000 50 9126 -Ethernet202 55,56 100000 50 9126 -Ethernet204 49,50 100000 51 9126 -Ethernet206 51,52 100000 51 9126 -Ethernet208 41,42 100000 52 9126 -Ethernet210 43,44 100000 52 9126 -Ethernet212 45,46 100000 53 9126 -Ethernet214 47,48 100000 53 9126 -Ethernet216 37,38 100000 54 9126 -Ethernet218 39,40 100000 54 9126 -Ethernet220 33,34 100000 55 9126 -Ethernet222 35,36 100000 55 9126 -Ethernet224 25,26 100000 56 9126 -Ethernet226 27,28 100000 56 9126 -Ethernet228 29,30 100000 57 9126 -Ethernet230 31,32 100000 57 9126 -Ethernet232 21,22 100000 58 9126 -Ethernet234 23,24 100000 58 9126 -Ethernet236 17,18 100000 59 9126 -Ethernet238 19,20 100000 59 9126 -Ethernet240 9,10 100000 60 9126 -Ethernet242 11,12 100000 60 9126 -Ethernet244 13,14 100000 61 9126 -Ethernet246 15,16 100000 61 9126 -Ethernet248 5,6 100000 62 9126 -Ethernet250 7,8 100000 62 9126 -Ethernet252 1,2 100000 63 9126 -Ethernet254 3,4 100000 63 9126 -Ethernet256 257 10000 64 9126 -Ethernet257 258 10000 65 9126 +# name lanes alias speed index mtu +Ethernet0 249,250 Eth1/1 100000 0 9126 +Ethernet2 251,252 Eth1/2 100000 0 9126 +Ethernet4 253,254 Eth2/1 100000 1 9126 +Ethernet6 255,256 Eth2/2 100000 1 9126 +Ethernet8 245,246 Eth3/1 100000 2 9126 +Ethernet10 247,248 Eth3/2 100000 2 9126 +Ethernet12 241,242 Eth4/1 100000 3 9126 +Ethernet14 243,244 Eth4/2 100000 3 9126 +Ethernet16 233,234 Eth5/1 100000 4 9126 +Ethernet18 235,236 Eth5/2 100000 4 9126 +Ethernet20 237,238 Eth6/1 100000 5 9126 +Ethernet22 239,240 Eth6/2 100000 5 9126 +Ethernet24 229,230 Eth7/1 100000 6 9126 +Ethernet26 231,232 Eth7/2 100000 6 9126 +Ethernet28 225,226 Eth8/1 100000 7 9126 +Ethernet30 227,228 Eth8/2 100000 7 9126 +Ethernet32 217,218 Eth9/1 100000 8 9126 +Ethernet34 219,220 Eth9/2 100000 8 9126 +Ethernet36 221,222 Eth10/1 100000 9 9126 +Ethernet38 223,224 Eth10/2 100000 9 9126 +Ethernet40 213,214 Eth11/1 100000 10 9126 +Ethernet42 215,216 Eth11/2 100000 10 9126 +Ethernet44 209,210 Eth12/1 100000 11 9126 +Ethernet46 211,212 Eth12/2 100000 11 9126 +Ethernet48 201,202 Eth13/1 100000 12 9126 +Ethernet50 203,204 Eth13/2 100000 12 9126 +Ethernet52 205,206 Eth14/1 100000 13 9126 +Ethernet54 207,208 Eth14/2 100000 13 9126 +Ethernet56 197,198 Eth15/1 100000 14 9126 +Ethernet58 199,200 Eth15/2 100000 14 9126 +Ethernet60 193,194 Eth16/1 100000 15 9126 +Ethernet62 195,196 Eth16/2 100000 15 9126 +Ethernet64 185,186 Eth17/1 100000 16 9126 +Ethernet66 187,188 Eth17/2 100000 16 9126 +Ethernet68 189,190 Eth18/1 100000 17 9126 +Ethernet70 191,192 Eth18/2 100000 17 9126 +Ethernet72 181,182 Eth19/1 100000 18 9126 +Ethernet74 183,184 Eth19/2 100000 18 9126 +Ethernet76 177,178 Eth20/1 100000 19 9126 +Ethernet78 179,180 Eth20/2 100000 19 9126 +Ethernet80 169,170 Eth21/1 100000 20 9126 +Ethernet82 171,172 Eth21/2 100000 20 9126 +Ethernet84 173,174 Eth22/1 100000 21 9126 +Ethernet86 175,176 Eth22/2 100000 21 9126 +Ethernet88 165,166 Eth23/1 100000 22 9126 +Ethernet90 167,168 Eth23/2 100000 22 9126 +Ethernet92 161,162 Eth24/1 100000 23 9126 +Ethernet94 163,164 Eth24/2 100000 23 9126 +Ethernet96 153,154 Eth25/1 100000 24 9126 +Ethernet98 155,156 Eth25/2 100000 24 9126 +Ethernet100 157,158 Eth26/1 100000 25 9126 +Ethernet102 159,160 Eth26/2 100000 25 9126 +Ethernet104 149,150 Eth27/1 100000 26 9126 +Ethernet106 151,152 Eth27/2 100000 26 9126 +Ethernet108 145,146 Eth28/1 100000 27 9126 +Ethernet110 147,148 Eth28/2 100000 27 9126 +Ethernet112 137,138 Eth29/1 100000 28 9126 +Ethernet114 139,140 Eth29/2 100000 28 9126 +Ethernet116 141,142 Eth30/1 100000 29 9126 +Ethernet118 143,144 Eth30/2 100000 29 9126 +Ethernet120 133,134 Eth31/1 100000 30 9126 +Ethernet122 135,136 Eth31/2 100000 30 9126 +Ethernet124 129,130 Eth32/1 100000 31 9126 +Ethernet126 131,132 Eth32/2 100000 31 9126 +Ethernet128 121,122 Eth33/1 100000 32 9126 +Ethernet130 123,124 Eth33/2 100000 32 9126 +Ethernet132 125,126 Eth34/1 100000 33 9126 +Ethernet134 127,128 Eth34/2 100000 33 9126 +Ethernet136 117,118 Eth35/1 100000 34 9126 +Ethernet138 119,120 Eth35/2 100000 34 9126 +Ethernet140 113,114 Eth36/1 100000 35 9126 +Ethernet142 115,116 Eth36/2 100000 35 9126 +Ethernet144 105,106 Eth37/1 100000 36 9126 +Ethernet146 107,108 Eth37/2 100000 36 9126 +Ethernet148 109,110 Eth38/1 100000 37 9126 +Ethernet150 111,112 Eth38/2 100000 37 9126 +Ethernet152 101,102 Eth39/1 100000 38 9126 +Ethernet154 103,104 Eth39/2 100000 38 9126 +Ethernet156 97,98 Eth40/1 100000 39 9126 +Ethernet158 99,100 Eth40/2 100000 39 9126 +Ethernet160 89,90 Eth41/1 100000 40 9126 +Ethernet162 91,92 Eth41/2 100000 40 9126 +Ethernet164 93,94 Eth42/1 100000 41 9126 +Ethernet166 95,96 Eth42/2 100000 41 9126 +Ethernet168 85,86 Eth43/1 100000 42 9126 +Ethernet170 87,88 Eth43/2 100000 42 9126 +Ethernet172 81,82 Eth44/1 100000 43 9126 +Ethernet174 83,84 Eth44/2 100000 43 9126 +Ethernet176 73,74 Eth45/1 100000 44 9126 +Ethernet178 75,76 Eth45/2 100000 44 9126 +Ethernet180 77,78 Eth46/1 100000 45 9126 +Ethernet182 79,80 Eth46/2 100000 45 9126 +Ethernet184 69,70 Eth47/1 100000 46 9126 +Ethernet186 71,72 Eth47/2 100000 46 9126 +Ethernet188 65,66 Eth48/1 100000 47 9126 +Ethernet190 67,68 Eth48/2 100000 47 9126 +Ethernet192 57,58 Eth49/1 100000 48 9126 +Ethernet194 59,60 Eth49/2 100000 48 9126 +Ethernet196 61,62 Eth50/1 100000 49 9126 +Ethernet198 63,64 Eth50/2 100000 49 9126 +Ethernet200 53,54 Eth51/1 100000 50 9126 +Ethernet202 55,56 Eth51/2 100000 50 9126 +Ethernet204 49,50 Eth52/1 100000 51 9126 +Ethernet206 51,52 Eth52/2 100000 51 9126 +Ethernet208 41,42 Eth53/1 100000 52 9126 +Ethernet210 43,44 Eth53/2 100000 52 9126 +Ethernet212 45,46 Eth54/1 100000 53 9126 +Ethernet214 47,48 Eth54/2 100000 53 9126 +Ethernet216 37,38 Eth55/1 100000 54 9126 +Ethernet218 39,40 Eth55/2 100000 54 9126 +Ethernet220 33,34 Eth56/1 100000 55 9126 +Ethernet222 35,36 Eth56/2 100000 55 9126 +Ethernet224 25,26 Eth57/1 100000 56 9126 +Ethernet226 27,28 Eth57/2 100000 56 9126 +Ethernet228 29,30 Eth58/1 100000 57 9126 +Ethernet230 31,32 Eth58/2 100000 57 9126 +Ethernet232 21,22 Eth59/1 100000 58 9126 +Ethernet234 23,24 Eth59/2 100000 58 9126 +Ethernet236 17,18 Eth60/1 100000 59 9126 +Ethernet238 19,20 Eth60/2 100000 59 9126 +Ethernet240 9,10 Eth61/1 100000 60 9126 +Ethernet242 11,12 Eth61/2 100000 60 9126 +Ethernet244 13,14 Eth62/1 100000 61 9126 +Ethernet246 15,16 Eth62/2 100000 61 9126 +Ethernet248 5,6 Eth63/1 100000 62 9126 +Ethernet250 7,8 Eth63/2 100000 62 9126 +Ethernet252 1,2 Eth64/1 100000 63 9126 +Ethernet254 3,4 Eth64/2 100000 63 9126 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 index 733bd51dc86..4b9748c7b59 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 128 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 index 4fca9cbcd15..93dac6b1992 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 32 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml index 6c387ee17c2..f59530d3a8f 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_A" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -280,20 +283,6 @@ nodes: speed: "400G" sysport: "1" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" lane_swap: "01234567" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/ivm.sai.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/ivm.sai.config.yaml new file mode 100755 index 00000000000..bc9c7eabdda --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/pg_profile_lookup.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini index c8ded273cca..28aab327c1a 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini @@ -1,35 +1,33 @@ -# name lanes speed index mtu fec -Ethernet0 249,250,251,252 400000 0 9126 rs -Ethernet8 241,242,243,244 400000 2 9126 rs -Ethernet16 233,234,235,236 400000 4 9126 rs -Ethernet24 225,226,227,228 400000 6 9126 rs -Ethernet32 217,218,219,220 400000 8 9126 rs -Ethernet40 209,210,211,212 400000 10 9126 rs -Ethernet48 201,202,203,204 400000 12 9126 rs -Ethernet56 193,194,195,196 400000 14 9126 rs -Ethernet64 185,186,187,188 400000 16 9126 rs -Ethernet72 177,178,179,180 400000 18 9126 rs -Ethernet80 169,170,171,172 400000 20 9126 rs -Ethernet88 161,162,163,164 400000 22 9126 rs -Ethernet96 153,154,155,156 400000 24 9126 rs -Ethernet104 145,146,147,148 400000 26 9126 rs -Ethernet112 137,138,139,140 400000 28 9126 rs -Ethernet120 129,130,131,132 400000 30 9126 rs -Ethernet128 121,122,123,124 400000 32 9126 rs -Ethernet136 113,114,115,116 400000 34 9126 rs -Ethernet144 105,106,107,108 400000 36 9126 rs -Ethernet152 97,98,99,100 400000 38 9126 rs -Ethernet160 89,90,91,92 400000 40 9126 rs -Ethernet168 81,82,83,84 400000 42 9126 rs -Ethernet176 73,74,75,76 400000 44 9126 rs -Ethernet184 65,66,67,68 400000 46 9126 rs -Ethernet192 57,58,59,60 400000 48 9126 rs -Ethernet200 49,50,51,52 400000 50 9126 rs -Ethernet208 41,42,43,44 400000 52 9126 rs -Ethernet216 33,34,35,36 400000 54 9126 rs -Ethernet224 25,26,27,28 400000 56 9126 rs -Ethernet232 17,18,19,20 400000 58 9126 rs -Ethernet240 9,10,11,12 400000 60 9126 rs -Ethernet248 1,2,3,4 400000 62 9126 rs -Ethernet256 257 10000 64 9126 none -Ethernet257 258 10000 65 9126 none +# name lanes alias speed index mtu fec +Ethernet0 249,250,251,252,253,254,255,256 Ethernet0 400000 0 9126 rs +Ethernet8 241,242,243,244,245,246,247,248 Ethernet8 400000 2 9126 rs +Ethernet16 233,234,235,236,237,238,239,240 Ethernet6 400000 4 9126 rs +Ethernet24 225,226,227,228,229,230,231,232 Ethernet24 400000 6 9126 rs +Ethernet32 217,218,219,220,221,222,223,224 Ethernet32 400000 8 9126 rs +Ethernet40 209,210,211,212,213,214,215,216 Ethernet40 400000 10 9126 rs +Ethernet48 201,202,203,204,205,206,207,208 Ethernet48 400000 12 9126 rs +Ethernet56 193,194,195,196,197,198,199,200 Ethernet56 400000 14 9126 rs +Ethernet64 185,186,187,188,189,190,191,192 Ethernet64 400000 16 9126 rs +Ethernet72 177,178,179,180,181,182,183,184 Ethernet72 400000 18 9126 rs +Ethernet80 169,170,171,172,173,174,175,176 Ethernet80 400000 20 9126 rs +Ethernet88 161,162,163,164,165,166,167,168 Ethernet88 400000 22 9126 rs +Ethernet96 153,154,155,156,157,158,159,160 Ethernet96 400000 24 9126 rs +Ethernet104 145,146,147,148,149,150,151,152 Ethernet104 400000 26 9126 rs +Ethernet112 137,138,139,140,141,142,143,144 Ethernet112 400000 28 9126 rs +Ethernet120 129,130,131,132,133,134,135,136 Ethernet120 400000 30 9126 rs +Ethernet128 121,122,123,124,125,126,127,128 Ethernet128 400000 32 9126 rs +Ethernet136 113,114,115,116,117,118,119,120 Ethernet136 400000 34 9126 rs +Ethernet144 105,106,107,108,109,110,111,112 Ethernet144 400000 36 9126 rs +Ethernet152 97,98,99,100,101,102,103,104 Ethernet152 400000 38 9126 rs +Ethernet160 89,90,91,92,93,94,95,96 Ethernet160 400000 40 9126 rs +Ethernet168 81,82,83,84,85,86,87,88 Ethernet168 400000 42 9126 rs +Ethernet176 73,74,75,76,77,78,79,80 Ethernet176 400000 44 9126 rs +Ethernet184 65,66,67,68,69,70,71,72 Ethernet184 400000 46 9126 rs +Ethernet192 57,58,59,60,61,62,63,64 Ethernet192 400000 48 9126 rs +Ethernet200 49,50,51,52,53,54,55,56 Ethernet200 400000 50 9126 rs +Ethernet208 41,42,43,44,45,46,47,48 Ethernet208 400000 52 9126 rs +Ethernet216 33,34,35,36,37,38,39,40 Ethernet216 400000 54 9126 rs +Ethernet224 25,26,27,28,29,30,31,32 Ethernet224 400000 56 9126 rs +Ethernet232 17,18,19,20,21,22,23,24 Ethernet232 400000 58 9126 rs +Ethernet240 9,10,11,12,13,14,15,16 Ethernet240 400000 60 9126 rs +Ethernet248 1,2,3,4,5,6,7,8 Ethernet248 400000 62 9126 rs diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 index 6c734d46ff2..4b9748c7b59 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 32 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 index 45cebf3b714..93dac6b1992 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 64 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml index 813d012ca3d..9788885f46e 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -632,24 +635,6 @@ nodes: type: "eth" admin_state: "true" loopback: "none" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - admin_state: "true" - loopback: "none" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" - admin_state: "true" - loopback: "none" isg: - id: "0" lane_swap: "01234567" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/ivm.sai.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..ac0a862dbc2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_nrz_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/pg_profile_lookup.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini index cb862ff9b52..6ac13773d8c 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini @@ -1,67 +1,65 @@ -# name lanes speed index mtu -Ethernet0 249,250,251,252 100000 0 9126 -Ethernet4 253,254,255,256 100000 1 9126 -Ethernet8 245,246,247,248 100000 2 9126 -Ethernet12 241,242,243,244 100000 3 9126 -Ethernet16 233,234,235,236 100000 4 9126 -Ethernet20 237,238,239,240 100000 5 9126 -Ethernet24 229,230,231,232 100000 6 9126 -Ethernet28 225,226,227,228 100000 7 9126 -Ethernet32 217,218,219,220 100000 8 9126 -Ethernet36 221,222,223,224 100000 9 9126 -Ethernet40 213,214,215,216 100000 10 9126 -Ethernet44 209,210,211,212 100000 11 9126 -Ethernet48 201,202,203,204 100000 12 9126 -Ethernet52 205,206,207,208 100000 13 9126 -Ethernet56 197,198,199,200 100000 14 9126 -Ethernet60 193,194,195,196 100000 15 9126 -Ethernet64 185,186,187,188 100000 16 9126 -Ethernet68 189,190,191,192 100000 17 9126 -Ethernet72 181,182,183,184 100000 18 9126 -Ethernet76 177,178,179,180 100000 19 9126 -Ethernet80 169,170,171,172 100000 20 9126 -Ethernet84 173,174,175,176 100000 21 9126 -Ethernet88 165,166,167,168 100000 22 9126 -Ethernet92 161,162,163,164 100000 23 9126 -Ethernet96 153,154,155,156 100000 24 9126 -Ethernet100 157,158,159,160 100000 25 9126 -Ethernet104 149,150,151,152 100000 26 9126 -Ethernet108 145,146,147,148 100000 27 9126 -Ethernet112 137,138,139,140 100000 28 9126 -Ethernet116 141,142,143,144 100000 29 9126 -Ethernet120 133,134,135,136 100000 30 9126 -Ethernet124 129,130,131,132 100000 31 9126 -Ethernet128 121,122,123,124 100000 32 9126 -Ethernet132 125,126,127,128 100000 33 9126 -Ethernet136 117,118,119,120 100000 34 9126 -Ethernet140 113,114,115,116 100000 35 9126 -Ethernet144 105,106,107,108 100000 36 9126 -Ethernet148 109,110,111,112 100000 37 9126 -Ethernet152 101,102,103,104 100000 38 9126 -Ethernet156 97,98,99,100 100000 39 9126 -Ethernet160 89,90,91,92 100000 40 9126 -Ethernet164 93,94,95,96 100000 41 9126 -Ethernet168 85,86,87,88 100000 42 9126 -Ethernet172 81,82,83,84 100000 43 9126 -Ethernet176 73,74,75,76 100000 44 9126 -Ethernet180 77,78,79,80 100000 45 9126 -Ethernet184 69,70,71,72 100000 46 9126 -Ethernet188 65,66,67,68 100000 47 9126 -Ethernet192 57,58,59,60 100000 48 9126 -Ethernet196 61,62,63,64 100000 49 9126 -Ethernet200 53,54,55,56 100000 50 9126 -Ethernet204 49,50,51,52 100000 51 9126 -Ethernet208 41,42,43,44 100000 52 9126 -Ethernet212 45,46,47,48 100000 53 9126 -Ethernet216 37,38,39,40 100000 54 9126 -Ethernet220 33,34,35,36 100000 55 9126 -Ethernet224 25,26,27,28 100000 56 9126 -Ethernet228 29,30,31,32 100000 57 9126 -Ethernet232 21,22,23,24 100000 58 9126 -Ethernet236 17,18,19,20 100000 59 9126 -Ethernet240 9,10,11,12 100000 60 9126 -Ethernet244 13,14,15,16 100000 61 9126 -Ethernet248 5,6,7,8 100000 62 9126 -Ethernet252 1,2,3,4 100000 63 9126 -Ethernet256 257 10000 64 9126 -Ethernet257 258 10000 65 9126 +# name lanes alias speed index mtu +Ethernet0 249,250,251,252 Eth1 100000 0 9126 +Ethernet4 253,254,255,256 Eth2 100000 1 9126 +Ethernet8 245,246,247,248 Eth3 100000 2 9126 +Ethernet12 241,242,243,244 Eth4 100000 3 9126 +Ethernet16 233,234,235,236 Eth5 100000 4 9126 +Ethernet20 237,238,239,240 Eth6 100000 5 9126 +Ethernet24 229,230,231,232 Eth7 100000 6 9126 +Ethernet28 225,226,227,228 Eth8 100000 7 9126 +Ethernet32 217,218,219,220 Eth9 100000 8 9126 +Ethernet36 221,222,223,224 Eth10 100000 9 9126 +Ethernet40 213,214,215,216 Eth11 100000 10 9126 +Ethernet44 209,210,211,212 Eth12 100000 11 9126 +Ethernet48 201,202,203,204 Eth13 100000 12 9126 +Ethernet52 205,206,207,208 Eth14 100000 13 9126 +Ethernet56 197,198,199,200 Eth15 100000 14 9126 +Ethernet60 193,194,195,196 Eth16 100000 15 9126 +Ethernet64 185,186,187,188 Eth17 100000 16 9126 +Ethernet68 189,190,191,192 Eth18 100000 17 9126 +Ethernet72 181,182,183,184 Eth19 100000 18 9126 +Ethernet76 177,178,179,180 Eth20 100000 19 9126 +Ethernet80 169,170,171,172 Eth21 100000 20 9126 +Ethernet84 173,174,175,176 Eth22 100000 21 9126 +Ethernet88 165,166,167,168 Eth23 100000 22 9126 +Ethernet92 161,162,163,164 Eth24 100000 23 9126 +Ethernet96 153,154,155,156 Eth25 100000 24 9126 +Ethernet100 157,158,159,160 Eth26 100000 25 9126 +Ethernet104 149,150,151,152 Eth27 100000 26 9126 +Ethernet108 145,146,147,148 Eth28 100000 27 9126 +Ethernet112 137,138,139,140 Eth29 100000 28 9126 +Ethernet116 141,142,143,144 Eth30 100000 29 9126 +Ethernet120 133,134,135,136 Eth31 100000 30 9126 +Ethernet124 129,130,131,132 Eth32 100000 31 9126 +Ethernet128 121,122,123,124 Eth33 100000 32 9126 +Ethernet132 125,126,127,128 Eth34 100000 33 9126 +Ethernet136 117,118,119,120 Eth35 100000 34 9126 +Ethernet140 113,114,115,116 Eth36 100000 35 9126 +Ethernet144 105,106,107,108 Eth37 100000 36 9126 +Ethernet148 109,110,111,112 Eth38 100000 37 9126 +Ethernet152 101,102,103,104 Eth39 100000 38 9126 +Ethernet156 97,98,99,100 Eth40 100000 39 9126 +Ethernet160 89,90,91,92 Eth41 100000 40 9126 +Ethernet164 93,94,95,96 Eth42 100000 41 9126 +Ethernet168 85,86,87,88 Eth43 100000 42 9126 +Ethernet172 81,82,83,84 Eth44 100000 43 9126 +Ethernet176 73,74,75,76 Eth45 100000 44 9126 +Ethernet180 77,78,79,80 Eth46 100000 45 9126 +Ethernet184 69,70,71,72 Eth47 100000 46 9126 +Ethernet188 65,66,67,68 Eth48 100000 47 9126 +Ethernet192 57,58,59,60 Eth49 100000 48 9126 +Ethernet196 61,62,63,64 Eth50 100000 49 9126 +Ethernet200 53,54,55,56 Eth51 100000 50 9126 +Ethernet204 49,50,51,52 Eth52 100000 51 9126 +Ethernet208 41,42,43,44 Eth53 100000 52 9126 +Ethernet212 45,46,47,48 Eth54 100000 53 9126 +Ethernet216 37,38,39,40 Eth55 100000 54 9126 +Ethernet220 33,34,35,36 Eth56 100000 55 9126 +Ethernet224 25,26,27,28 Eth57 100000 56 9126 +Ethernet228 29,30,31,32 Eth58 100000 57 9126 +Ethernet232 21,22,23,24 Eth59 100000 58 9126 +Ethernet236 17,18,19,20 Eth60 100000 59 9126 +Ethernet240 9,10,11,12 Eth61 100000 60 9126 +Ethernet244 13,14,15,16 Eth62 100000 61 9126 +Ethernet248 5,6,7,8 Eth63 100000 62 9126 +Ethernet252 1,2,3,4 Eth64 100000 63 9126 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 index 16f9b42a216..4b9748c7b59 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 64 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 index 0285e389fd6..e70268bee84 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 @@ -75,10 +75,10 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38166", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", @@ -93,7 +93,7 @@ "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml index 8fb6a114a46..798a71c9a78 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml @@ -4,6 +4,7 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/ivm.sai.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/ivm.sai.config.yaml new file mode 100755 index 00000000000..7ad9c806fd6 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_nrz_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 index b22aa6ef599..56e2b411e20 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 @@ -93,9 +93,9 @@ }, "PORT_QOS_MAP": { "Ethernet180,Ethernet8,Ethernet44,Ethernet184,Ethernet188,Ethernet0,Ethernet4,Ethernet108,Ethernet248,Ethernet100,Ethernet244,Ethernet128,Ethernet104,Ethernet240,Ethernet40,Ethernet228,Ethernet96,Ethernet168,Ethernet148,Ethernet204,Ethernet120,Ethernet220,Ethernet144,Ethernet208,Ethernet160,Ethernet224,Ethernet140,Ethernet56,Ethernet164,Ethernet76,Ethernet72,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet196,Ethernet28,Ethernet192,Ethernet200,Ethernet124,Ethernet24,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet152,Ethernet136,Ethernet156,Ethernet92,Ethernet132,Ethernet48,Ethernet232,Ethernet172,Ethernet216,Ethernet236,Ethernet176,Ethernet212,Ethernet64,Ethernet88,Ethernet60,Ethernet52,Ethernet20,Ethernet68,Ethernet252": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", "pfc_enable": "4,5" } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 index 45cebf3b714..93dac6b1992 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 64 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml index 7133de54e49..9e67f7cf60d 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -504,20 +507,6 @@ nodes: speed: "200G" sysport: "1" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 0" isg: - id: "0" lane_swap: "01234567" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/ivm.sai.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/ivm.sai.config.yaml new file mode 100755 index 00000000000..61246f89cee --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x200G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/pg_profile_lookup.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini index 3dcbf72bc32..a45a17b5268 100644 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini @@ -1,67 +1,65 @@ -# name lanes speed index mtu fec -Ethernet0 249,250,251,252 200000 0 9126 rs -Ethernet4 253,254,255,256 200000 1 9126 rs -Ethernet8 245,246,247,248 200000 2 9126 rs -Ethernet12 241,242,243,244 200000 3 9126 rs -Ethernet16 233,234,235,236 200000 4 9126 rs -Ethernet20 237,238,239,240 200000 5 9126 rs -Ethernet24 229,230,231,232 200000 6 9126 rs -Ethernet28 225,226,227,228 200000 7 9126 rs -Ethernet32 217,218,219,220 200000 8 9126 rs -Ethernet36 221,222,223,224 200000 9 9126 rs -Ethernet40 213,214,215,216 200000 10 9126 rs -Ethernet44 209,210,211,212 200000 11 9126 rs -Ethernet48 201,202,203,204 200000 12 9126 rs -Ethernet52 205,206,207,208 200000 13 9126 rs -Ethernet56 197,198,199,200 200000 14 9126 rs -Ethernet60 193,194,195,196 200000 15 9126 rs -Ethernet64 185,186,187,188 200000 16 9126 rs -Ethernet68 189,190,191,192 200000 17 9126 rs -Ethernet72 181,182,183,184 200000 18 9126 rs -Ethernet76 177,178,179,180 200000 19 9126 rs -Ethernet80 169,170,171,172 200000 20 9126 rs -Ethernet84 173,174,175,176 200000 21 9126 rs -Ethernet88 165,166,167,168 200000 22 9126 rs -Ethernet92 161,162,163,164 200000 23 9126 rs -Ethernet96 153,154,155,156 200000 24 9126 rs -Ethernet100 157,158,159,160 200000 25 9126 rs -Ethernet104 149,150,151,152 200000 26 9126 rs -Ethernet108 145,146,147,148 200000 27 9126 rs -Ethernet112 137,138,139,140 200000 28 9126 rs -Ethernet116 141,142,143,144 200000 29 9126 rs -Ethernet120 133,134,135,136 200000 30 9126 rs -Ethernet124 129,130,131,132 200000 31 9126 rs -Ethernet128 121,122,123,124 200000 32 9126 rs -Ethernet132 125,126,127,128 200000 33 9126 rs -Ethernet136 117,118,119,120 200000 34 9126 rs -Ethernet140 113,114,115,116 200000 35 9126 rs -Ethernet144 105,106,107,108 200000 36 9126 rs -Ethernet148 109,110,111,112 200000 37 9126 rs -Ethernet152 101,102,103,104 200000 38 9126 rs -Ethernet156 97,98,99,100 200000 39 9126 rs -Ethernet160 89,90,91,92 200000 40 9126 rs -Ethernet164 93,94,95,96 200000 41 9126 rs -Ethernet168 85,86,87,88 200000 42 9126 rs -Ethernet172 81,82,83,84 200000 43 9126 rs -Ethernet176 73,74,75,76 200000 44 9126 rs -Ethernet180 77,78,79,80 200000 45 9126 rs -Ethernet184 69,70,71,72 200000 46 9126 rs -Ethernet188 65,66,67,68 200000 47 9126 rs -Ethernet192 57,58,59,60 200000 48 9126 rs -Ethernet196 61,62,63,64 200000 49 9126 rs -Ethernet200 53,54,55,56 200000 50 9126 rs -Ethernet204 49,50,51,52 200000 51 9126 rs -Ethernet208 41,42,43,44 200000 52 9126 rs -Ethernet212 45,46,47,48 200000 53 9126 rs -Ethernet216 37,38,39,40 200000 54 9126 rs -Ethernet220 33,34,35,36 200000 55 9126 rs -Ethernet224 25,26,27,28 200000 56 9126 rs -Ethernet228 29,30,31,32 200000 57 9126 rs -Ethernet232 21,22,23,24 200000 58 9126 rs -Ethernet236 17,18,19,20 200000 59 9126 rs -Ethernet240 9,10,11,12 200000 60 9126 rs -Ethernet244 13,14,15,16 200000 61 9126 rs -Ethernet248 5,6,7,8 200000 62 9126 rs -Ethernet252 1,2,3,4 200000 63 9126 rs -Ethernet256 257 10000 64 9126 none -Ethernet257 258 10000 65 9126 none +# name lanes alias speed index mtu fec +Ethernet0 249,250,251,252 Eth1 200000 0 9126 rs +Ethernet4 253,254,255,256 Eth2 200000 1 9126 rs +Ethernet8 245,246,247,248 Eth3 200000 2 9126 rs +Ethernet12 241,242,243,244 Eth4 200000 3 9126 rs +Ethernet16 233,234,235,236 Eth5 200000 4 9126 rs +Ethernet20 237,238,239,240 Eth6 200000 5 9126 rs +Ethernet24 229,230,231,232 Eth7 200000 6 9126 rs +Ethernet28 225,226,227,228 Eth8 200000 7 9126 rs +Ethernet32 217,218,219,220 Eth9 200000 8 9126 rs +Ethernet36 221,222,223,224 Eth10 200000 9 9126 rs +Ethernet40 213,214,215,216 Eth11 200000 10 9126 rs +Ethernet44 209,210,211,212 Eth12 200000 11 9126 rs +Ethernet48 201,202,203,204 Eth13 200000 12 9126 rs +Ethernet52 205,206,207,208 Eth14 200000 13 9126 rs +Ethernet56 197,198,199,200 Eth15 200000 14 9126 rs +Ethernet60 193,194,195,196 Eth16 200000 15 9126 rs +Ethernet64 185,186,187,188 Eth17 200000 16 9126 rs +Ethernet68 189,190,191,192 Eth18 200000 17 9126 rs +Ethernet72 181,182,183,184 Eth19 200000 18 9126 rs +Ethernet76 177,178,179,180 Eth20 200000 19 9126 rs +Ethernet80 169,170,171,172 Eth21 200000 20 9126 rs +Ethernet84 173,174,175,176 Eth22 200000 21 9126 rs +Ethernet88 165,166,167,168 Eth23 200000 22 9126 rs +Ethernet92 161,162,163,164 Eth24 200000 23 9126 rs +Ethernet96 153,154,155,156 Eth25 200000 24 9126 rs +Ethernet100 157,158,159,160 Eth26 200000 25 9126 rs +Ethernet104 149,150,151,152 Eth27 200000 26 9126 rs +Ethernet108 145,146,147,148 Eth28 200000 27 9126 rs +Ethernet112 137,138,139,140 Eth29 200000 28 9126 rs +Ethernet116 141,142,143,144 Eth30 200000 29 9126 rs +Ethernet120 133,134,135,136 Eth31 200000 30 9126 rs +Ethernet124 129,130,131,132 Eth32 200000 31 9126 rs +Ethernet128 121,122,123,124 Eth33 200000 32 9126 rs +Ethernet132 125,126,127,128 Eth34 200000 33 9126 rs +Ethernet136 117,118,119,120 Eth35 200000 34 9126 rs +Ethernet140 113,114,115,116 Eth36 200000 35 9126 rs +Ethernet144 105,106,107,108 Eth37 200000 36 9126 rs +Ethernet148 109,110,111,112 Eth38 200000 37 9126 rs +Ethernet152 101,102,103,104 Eth39 200000 38 9126 rs +Ethernet156 97,98,99,100 Eth40 200000 39 9126 rs +Ethernet160 89,90,91,92 Eth41 200000 40 9126 rs +Ethernet164 93,94,95,96 Eth42 200000 41 9126 rs +Ethernet168 85,86,87,88 Eth43 200000 42 9126 rs +Ethernet172 81,82,83,84 Eth44 200000 43 9126 rs +Ethernet176 73,74,75,76 Eth45 200000 44 9126 rs +Ethernet180 77,78,79,80 Eth46 200000 45 9126 rs +Ethernet184 69,70,71,72 Eth47 200000 46 9126 rs +Ethernet188 65,66,67,68 Eth48 200000 47 9126 rs +Ethernet192 57,58,59,60 Eth49 200000 48 9126 rs +Ethernet196 61,62,63,64 Eth50 200000 49 9126 rs +Ethernet200 53,54,55,56 Eth51 200000 50 9126 rs +Ethernet204 49,50,51,52 Eth52 200000 51 9126 rs +Ethernet208 41,42,43,44 Eth53 200000 52 9126 rs +Ethernet212 45,46,47,48 Eth54 200000 53 9126 rs +Ethernet216 37,38,39,40 Eth55 200000 54 9126 rs +Ethernet220 33,34,35,36 Eth56 200000 55 9126 rs +Ethernet224 25,26,27,28 Eth57 200000 56 9126 rs +Ethernet228 29,30,31,32 Eth58 200000 57 9126 rs +Ethernet232 21,22,23,24 Eth59 200000 58 9126 rs +Ethernet236 17,18,19,20 Eth60 200000 59 9126 rs +Ethernet240 9,10,11,12 Eth61 200000 60 9126 rs +Ethernet244 13,14,15,16 Eth62 200000 61 9126 rs +Ethernet248 5,6,7,8 Eth63 200000 62 9126 rs +Ethernet252 1,2,3,4 Eth64 200000 63 9126 rs diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 index 16f9b42a216..4b9748c7b59 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 64 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos_defaults_t1.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/minigraph.xml b/device/celestica/x86_64-cel_midstone-r0/minigraph.xml new file mode 100755 index 00000000000..780fbcd0b54 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/minigraph.xml @@ -0,0 +1,1723 @@ + + + + + + false + switch1 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 10 + 3 + + + switch1 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 10 + 3 + + + false + switch1 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 10 + 3 + + + switch1 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 10 + 3 + + + false + switch1 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 10 + 3 + + + switch1 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 10 + 3 + + + false + switch1 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 10 + 3 + + + switch1 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 10 + 3 + + + + + 65100 + switch1 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ + BGPPeer +
10.1.0.32
+ + + + BGPSLBPassive + 10.250.0.0/25 +
+ + BGPPeer +
10.1.0.32
+ + + + BGPVac + 192.168.0.0/21 +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + + HostIP + eth0 + + 10.60.60.60/16 + + 10.60.60.60/16 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + HostIP + usb0 + + 10.42.0.1/24 + + 10.42.0.1/24 + + + + + + + switch1 + + + + + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet64 + FC00::41/126 + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet0 + FC00::1/126 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet68 + FC00::45/126 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet4 + FC00::5/126 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet72 + FC00::49/126 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet8 + FC00::9/126 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet76 + FC00::4D/126 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet12 + FC00::D/126 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet80 + FC00::51/126 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet16 + FC00::11/126 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet84 + FC00::55/126 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet20 + FC00::15/126 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet88 + FC00::59/126 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet24 + FC00::19/126 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet92 + FC00::5D/126 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet28 + FC00::1D/126 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet96 + FC00::61/126 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet32 + FC00::21/126 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet100 + FC00::65/126 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet36 + FC00::25/126 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet104 + FC00::69/126 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet40 + FC00::29/126 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet108 + FC00::6D/126 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet44 + FC00::2D/126 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet112 + FC00::71/126 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet48 + FC00::31/126 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet116 + FC00::75/126 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet52 + FC00::35/126 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet120 + FC00::79/126 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet56 + FC00::39/126 + + + + Ethernet124 + 10.0.0.62/31 + + + + Ethernet124 + FC00::7D/126 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet60 + FC00::3D/126 + + + + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + VTY_LINE + ssh-only + SSH + + + Ethernet64;Ethernet0;Ethernet68;Ethernet4;Ethernet72;Ethernet8;Ethernet76;Ethernet12;Ethernet80;Ethernet16;Ethernet84;Ethernet20;Ethernet88;Ethernet24;Ethernet92;Ethernet28;Ethernet96;Ethernet32;Ethernet100;Ethernet36;Ethernet104;Ethernet40;Ethernet108;Ethernet44;Ethernet112;Ethernet48;Ethernet116;Ethernet52;Ethernet120;Ethernet56;Ethernet124;Ethernet60 + DataAcl + DataPlane + + + + + + + + + true + + + DeviceInterface + + true + true + 1 + Ethernet0 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet4 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet8 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet12 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet16 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet20 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet24 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet28 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet32 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet36 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet40 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet44 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet48 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet52 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet56 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet60 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet64 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet68 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet72 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet76 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet80 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet84 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet88 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet92 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet96 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet100 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet104 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet108 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet112 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet116 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet120 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet124 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet128 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet132 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet136 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet140 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet144 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet148 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet152 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet156 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet160 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet164 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet168 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet172 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet176 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet180 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet184 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet188 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet192 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet196 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet200 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet204 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet208 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet212 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet216 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet220 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet224 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet228 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet232 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet236 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet240 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet244 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet248 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet252 + + false + 0 + 0 + 100000 + + + DeviceInterface + + true + true + 1 + Ethernet256 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + true + 1 + Ethernet260 + + false + 0 + 0 + 10000 + + + true + 0 + Midstone-200i + + + + + + + DeviceInterfaceLink + ARISTA01T0 + Ethernet1 + switch1 + Ethernet64 + + + DeviceInterfaceLink + ARISTA01T2 + Ethernet1 + switch1 + Ethernet0 + + + DeviceInterfaceLink + ARISTA02T0 + Ethernet1 + switch1 + Ethernet68 + + + DeviceInterfaceLink + ARISTA02T2 + Ethernet1 + switch1 + Ethernet4 + + + DeviceInterfaceLink + ARISTA03T0 + Ethernet1 + switch1 + Ethernet72 + + + DeviceInterfaceLink + ARISTA03T2 + Ethernet1 + switch1 + Ethernet8 + + + DeviceInterfaceLink + ARISTA04T0 + Ethernet1 + switch1 + Ethernet76 + + + DeviceInterfaceLink + ARISTA04T2 + Ethernet1 + switch1 + Ethernet12 + + + DeviceInterfaceLink + ARISTA05T0 + Ethernet1 + switch1 + Ethernet80 + + + DeviceInterfaceLink + ARISTA05T2 + Ethernet1 + switch1 + Ethernet16 + + + DeviceInterfaceLink + ARISTA06T0 + Ethernet1 + switch1 + Ethernet84 + + + DeviceInterfaceLink + ARISTA06T2 + Ethernet1 + switch1 + Ethernet20 + + + DeviceInterfaceLink + ARISTA07T0 + Ethernet1 + switch1 + Ethernet88 + + + DeviceInterfaceLink + ARISTA07T2 + Ethernet1 + switch1 + Ethernet24 + + + DeviceInterfaceLink + ARISTA08T0 + Ethernet1 + switch1 + Ethernet92 + + + DeviceInterfaceLink + ARISTA08T2 + Ethernet1 + switch1 + Ethernet28 + + + DeviceInterfaceLink + ARISTA09T0 + Ethernet1 + switch1 + Ethernet96 + + + DeviceInterfaceLink + ARISTA09T2 + Ethernet1 + switch1 + Ethernet32 + + + DeviceInterfaceLink + ARISTA10T0 + Ethernet1 + switch1 + Ethernet100 + + + DeviceInterfaceLink + ARISTA10T2 + Ethernet1 + switch1 + Ethernet36 + + + DeviceInterfaceLink + ARISTA11T0 + Ethernet1 + switch1 + Ethernet104 + + + DeviceInterfaceLink + ARISTA11T2 + Ethernet1 + switch1 + Ethernet40 + + + DeviceInterfaceLink + ARISTA12T0 + Ethernet1 + switch1 + Ethernet108 + + + DeviceInterfaceLink + ARISTA12T2 + Ethernet1 + switch1 + Ethernet44 + + + DeviceInterfaceLink + ARISTA13T0 + Ethernet1 + switch1 + Ethernet112 + + + DeviceInterfaceLink + ARISTA13T2 + Ethernet1 + switch1 + Ethernet48 + + + DeviceInterfaceLink + ARISTA14T0 + Ethernet1 + switch1 + Ethernet116 + + + DeviceInterfaceLink + ARISTA14T2 + Ethernet1 + switch1 + Ethernet52 + + + DeviceInterfaceLink + ARISTA15T0 + Ethernet1 + switch1 + Ethernet120 + + + DeviceInterfaceLink + ARISTA15T2 + Ethernet1 + switch1 + Ethernet56 + + + DeviceInterfaceLink + ARISTA16T0 + Ethernet1 + switch1 + Ethernet124 + + + DeviceInterfaceLink + ARISTA16T2 + Ethernet1 + switch1 + Ethernet60 + + + + + switch1 + Midstone-200i + + 10.60.60.60 + + + + + + + + switch1 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + NtpResources + + 10.0.0.1;10.0.0.2 + + + SnmpResources + + 10.0.0.9 + + + SyslogResources + + 10.0.0.5;10.0.0.6 + + + TacacsGroup + + testlab + + + TacacsServer + + 10.0.0.9;10.0.0.8 + + + ForcedMgmtRoutes + + 10.0.0.100/31;10.250.0.8;10.255.0.0/28 + + + ErspanDestinationIpv4 + + 10.0.0.7 + + + + + + + switch1 + Midstone-200i +
diff --git a/device/celestica/x86_64-cel_midstone-r0/pmon_daemon_control.json b/device/celestica/x86_64-cel_midstone-r0/pmon_daemon_control.json index 94592fa8ceb..47936424810 100644 --- a/device/celestica/x86_64-cel_midstone-r0/pmon_daemon_control.json +++ b/device/celestica/x86_64-cel_midstone-r0/pmon_daemon_control.json @@ -1,3 +1,5 @@ { - "skip_ledd": true + "skip_ledd": true, + "skip_psud": true, + "skip_thermalctld": true } diff --git a/device/celestica/x86_64-cel_midstone-r0/topo.conf b/device/celestica/x86_64-cel_midstone-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/BALANCED b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/BALANCED new file mode 120000 index 00000000000..87afd08ffcd --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/RDMA-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/RDMA-CENTRIC new file mode 120000 index 00000000000..a05581efb9f --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/TCP-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/TCP-CENTRIC new file mode 120000 index 00000000000..dd9cf046c0f --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t0.j2 new file mode 100644 index 00000000000..c33d873068a --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t0.j2 @@ -0,0 +1,13 @@ +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '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 %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t1.j2 new file mode 100644 index 00000000000..c33d873068a --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffer_ports_t1.j2 @@ -0,0 +1,13 @@ +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '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 %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 deleted file mode 100644 index 4dd6bd96ad9..00000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 +++ /dev/null @@ -1,54 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- set ports2cable = { - 'torrouter_server' : '300m', - 'leafrouter_torrouter' : '300m', - 'spinerouter_leafrouter' : '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": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 deleted file mode 100644 index 3c93fb8fe2e..00000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 +++ /dev/null @@ -1,54 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- set ports2cable = { - 'torrouter_server' : '300m', - 'leafrouter_torrouter' : '300m', - 'spinerouter_leafrouter' : '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": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 new file mode 120000 index 00000000000..c25cc95d6d5 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9b..00000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 deleted file mode 100644 index 34002048afd..00000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 index abc2daefd04..5feba495693 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-C32/sai.profile.j2 @@ -1,7 +1,7 @@ {# Get sai.profile based on switch_role #} {%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined -%} {%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} -{%- if switch_role.lower() == 'torrouter' %} +{%- if 'torrouter' in switch_role.lower() %} {% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-seastone-dx010-32x100G-t0.config.bcm' -%} {%- else %} {% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-seastone-dx010-32x100G-t1.config.bcm' -%} @@ -11,3 +11,4 @@ {%- endif %} {# Write the contents of sai_ profile_filename to sai.profile file #} {{ sai_profile_contents }} +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/BALANCED b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/BALANCED new file mode 120000 index 00000000000..87afd08ffcd --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/gen/BALANCED \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/RDMA-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/RDMA-CENTRIC new file mode 120000 index 00000000000..a05581efb9f --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/RDMA-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/TCP-CENTRIC b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/TCP-CENTRIC new file mode 120000 index 00000000000..dd9cf046c0f --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/gen/TCP-CENTRIC \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffer_ports_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffer_ports_t0.j2 new file mode 100644 index 00000000000..b4f4f7bab3f --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffer_ports_t0.j2 @@ -0,0 +1,28 @@ +{%- set ports2cable = { + 'torrouter_server' : '300m', + 'leafrouter_torrouter' : '300m', + 'spinerouter_leafrouter' : '300m' + } +-%} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,9) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(14,17) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(22,31) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(10,13) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(18,21) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 deleted file mode 100644 index 4e4489f84a8..00000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1,69 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- set ports2cable = { - 'torrouter_server' : '300m', - 'leafrouter_torrouter' : '300m', - 'spinerouter_leafrouter' : '300m' - } --%} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,9) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(14,17) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(22,31) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(10,13) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} - {%- for port_idx in range(18,21) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini deleted file mode 100644 index 673df369a9b..00000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 90272 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 53248 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 96096 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 deleted file mode 100644 index 34002048afd..00000000000 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile index 46d96b2fd90..50220639519 100644 --- a/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile +++ b/device/celestica/x86_64-cel_seastone-r0/Celestica-DX010-D48C8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-seastone-dx010-48x50G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/celestica/x86_64-cel_seastone-r0/fancontrol-B2F b/device/celestica/x86_64-cel_seastone-r0/fancontrol-B2F index c2132d7f280..f3277db14df 100644 --- a/device/celestica/x86_64-cel_seastone-r0/fancontrol-B2F +++ b/device/celestica/x86_64-cel_seastone-r0/fancontrol-B2F @@ -8,4 +8,5 @@ MINSTART=13-002e/pwm1=89 13-002e/pwm2=89 13-002e/pwm3=89 13-002e/pwm4=89 13-002e MINSTOP=13-002e/pwm1=89 13-002e/pwm2=89 13-002e/pwm3=89 13-002e/pwm4=89 13-002e/pwm5=89 13-004d/pwm1=89 13-004d/pwm2=89 13-004d/pwm3=89 13-004d/pwm4=89 13-004d/pwm5=89 MINPWM=13-002e/pwm1=89 13-002e/pwm2=89 13-002e/pwm3=89 13-002e/pwm4=89 13-002e/pwm5=89 13-004d/pwm1=89 13-004d/pwm2=89 13-004d/pwm3=89 13-004d/pwm4=89 13-004d/pwm5=89 MAXPWM=13-002e/pwm1=255 13-002e/pwm2=255 13-002e/pwm3=255 13-002e/pwm4=255 13-002e/pwm5=255 13-004d/pwm1=255 13-004d/pwm2=255 13-004d/pwm3=255 13-004d/pwm4=255 13-004d/pwm5=255 -THYST=13-002e/pwm1=3 13-002e/pwm2=3 13-002e/pwm3=3 13-002e/pwm4=3 13-002e/pwm5=3 13-004d/pwm1=3 13-004d/pwm2=3 13-004d/pwm3=3 13-004d/pwm4=3 13-004d/pwm5=3 \ No newline at end of file +THYST=13-002e/pwm1=3 13-002e/pwm2=3 13-002e/pwm3=3 13-002e/pwm4=3 13-002e/pwm5=3 13-004d/pwm1=3 13-004d/pwm2=3 13-004d/pwm3=3 13-004d/pwm4=3 13-004d/pwm5=3 + diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py index d82f3749319..7b86fa12b51 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py @@ -1,2 +1,2 @@ -__all__ = ["platform", "chassis"] -from sonic_platform import * +import chassis +import platform diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py index 91e3dc0bf46..5102181feea 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py @@ -8,20 +8,10 @@ # ############################################################################# -import sys -import re -import os -import subprocess -import json - try: + import sys from sonic_platform_base.chassis_base import ChassisBase - from sonic_platform.fan import Fan - from sonic_platform.psu import Psu - from sonic_platform.component import Component - from sonic_platform.thermal import Thermal - from sonic_platform.sfp import Sfp - from sonic_platform.eeprom import Tlv + from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -33,9 +23,9 @@ NUM_COMPONENT = 5 RESET_REGISTER = "0x103" HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" -PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" REBOOT_CAUSE_FILE = "reboot-cause.txt" PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +GETREG_PATH = "/sys/devices/platform/dx010_cpld/getreg" HOST_CHK_CMD = "docker > /dev/null 2>&1" @@ -44,38 +34,59 @@ class Chassis(ChassisBase): def __init__(self): ChassisBase.__init__(self) - self.config_data = {} + self._api_helper = APIHelper() + self.sfp_module_initialized = False + self.__initialize_eeprom() + self.is_host = self._api_helper.is_host() + + if not self.is_host: + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + else: + self.__initialize_components() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, NUM_SFP): + sfp = Sfp(index) + self._sfp_list.append(sfp) + self.sfp_module_initialized = True + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_fan(self): + from sonic_platform.fan import Fan for fant_index in range(0, NUM_FAN_TRAY): for fan_index in range(0, NUM_FAN): fan = Fan(fant_index, fan_index) self._fan_list.append(fan) - for index in range(0, NUM_PSU): - psu = Psu(index) - self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + airflow = self.__get_air_flow() for index in range(0, NUM_THERMAL): - thermal = Thermal(index) + thermal = Thermal(index, airflow) self._thermal_list.append(thermal) - # sfp index start from 1 - for index in range(0, NUM_SFP): - sfp = Sfp(index) - self._sfp_list.append(sfp) - for index in range(0, NUM_COMPONENT): - component = Component(index) - self._component_list.append(component) + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv self._eeprom = Tlv() - def __is_host(self): - return os.system(HOST_CHK_CMD) == 0 + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return None + def __get_air_flow(self): + air_flow_path = '/usr/share/sonic/device/{}/fan_airflow'.format(self._api_helper.platform) if self.is_host else '/usr/share/sonic/platform/fan_airflow' + air_flow = self._api_helper.read_one_line_file(air_flow_path) + return air_flow or 'B2F' def get_base_mac(self): """ @@ -107,57 +118,71 @@ def get_system_eeprom_info(self): 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. + + REBOOT_CAUSE_POWER_LOSS = "Power Loss" + REBOOT_CAUSE_THERMAL_OVERLOAD_CPU = "Thermal Overload: CPU" + REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC = "Thermal Overload: ASIC" + REBOOT_CAUSE_THERMAL_OVERLOAD_OTHER = "Thermal Overload: Other" + REBOOT_CAUSE_INSUFFICIENT_FAN_SPEED = "Insufficient Fan Speed" + REBOOT_CAUSE_WATCHDOG = "Watchdog" + REBOOT_CAUSE_HARDWARE_OTHER = "Hardware - Other" + REBOOT_CAUSE_NON_HARDWARE = "Non-Hardware" + """ - description = 'None' - reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) + sw_reboot_cause = self._api_helper.read_txt_file( + reboot_cause_path) or "Unknown" + hw_reboot_cause = self._api_helper.get_cpld_reg_value( + GETREG_PATH, RESET_REGISTER) - reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) if self.__is_host( - ) else PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE - prev_reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + PREV_REBOOT_CAUSE_FILE) if self.__is_host( - ) else PMON_REBOOT_CAUSE_PATH + PREV_REBOOT_CAUSE_FILE + prev_reboot_cause = { + '0x11': (self.REBOOT_CAUSE_POWER_LOSS, 'Power on reset'), + '0x22': (self.REBOOT_CAUSE_HARDWARE_OTHER, 'CPLD_WD_RESET'), + '0x33': (self.REBOOT_CAUSE_HARDWARE_OTHER, 'Power cycle reset triggered by CPU'), + '0x44': (self.REBOOT_CAUSE_HARDWARE_OTHER, 'Power cycle reset triggered by reset button'), + '0x55': (self.REBOOT_CAUSE_THERMAL_OVERLOAD_CPU, ''), + '0x66': (self.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC, ''), + '0x77': (self.REBOOT_CAUSE_WATCHDOG, '') + }.get(hw_reboot_cause, (self.REBOOT_CAUSE_HARDWARE_OTHER, 'Unknown reason')) - hw_reboot_cause = self._component_list[0].get_register_value(RESET_REGISTER) + if sw_reboot_cause != 'Unknown' and hw_reboot_cause == '0x11': + prev_reboot_cause = ( + self.REBOOT_CAUSE_NON_HARDWARE, sw_reboot_cause) - sw_reboot_cause = self.__read_txt_file( - reboot_cause_path) or "Unknown" - prev_sw_reboot_cause = self.__read_txt_file( - prev_reboot_cause_path) or "Unknown" - - if sw_reboot_cause == "Unknown" and (prev_sw_reboot_cause == "Unknown" or prev_sw_reboot_cause == self.REBOOT_CAUSE_POWER_LOSS) and hw_reboot_cause == "0x11": - reboot_cause = self.REBOOT_CAUSE_POWER_LOSS - elif sw_reboot_cause != "Unknown" and hw_reboot_cause == "0x11": - reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE - description = sw_reboot_cause - elif prev_reboot_cause_path != "Unknown" and hw_reboot_cause == "0x11": - reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE - description = prev_sw_reboot_cause - elif hw_reboot_cause == "0x22": - reboot_cause = self.REBOOT_CAUSE_WATCHDOG, - else: - reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER - description = 'Unknown reason' + return prev_reboot_cause - return (reboot_cause, description) + ############################################################## + ######################## SFP methods ######################### + ############################################################## - def get_watchdog(self): + def get_num_sfps(self): """ - Retreives hardware watchdog device on this chassis + Retrieves the number of sfps available on this chassis Returns: - An object derived from WatchdogBase representing the hardware - watchdog device + An integer, the number of sfps available on this chassis """ - if self._watchdog is None: - from sonic_platform.watchdog import Watchdog - self._watchdog = Watchdog() + if not self.sfp_module_initialized: + self.__initialize_sfp() - return self._watchdog + return len(self._sfp_list) + + def get_all_sfps(self): + """ + Retrieves all sfps available on this chassis + Returns: + A list of objects derived from SfpBase representing all sfps + available on this chassis + """ + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return self._sfp_list def get_sfp(self, index): """ @@ -171,6 +196,8 @@ def get_sfp(self, index): An object dervied from SfpBase representing the specified sfp """ sfp = None + if not self.sfp_module_initialized: + self.__initialize_sfp() try: # The index will start from 1 @@ -179,3 +206,68 @@ def get_sfp(self, index): sys.stderr.write("SFP index {} out of range (1-{})\n".format( index, len(self._sfp_list))) return sfp + + ############################################################## + ####################### Other methods ######################## + ############################################################## + + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + if self._watchdog is None: + from sonic_platform.watchdog import Watchdog + self._watchdog = Watchdog() + + return self._watchdog + + ############################################################## + ###################### Device methods ######################## + ############################################################## + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self._api_helper.hwsku + + 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 device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_pn() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self.get_serial_number() + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + def get_thermal_manager(self): + from .thermal_manager import ThermalManager + return ThermalManager diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/component.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/component.py index d94a9347445..e51cd639a2e 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/component.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/component.py @@ -8,14 +8,13 @@ # ############################################################################# -import json import os.path import shutil -import shlex import subprocess try: from sonic_platform_base.component_base import ComponentBase + from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -29,7 +28,8 @@ GETREG_PATH = "/sys/devices/platform/dx010_cpld/getreg" BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" COMPONENT_NAME_LIST = ["CPLD1", "CPLD2", "CPLD3", "CPLD4", "BIOS"] -COMPONENT_DES_LIST = ["CPLD1", "CPLD2", "CPLD3", "CPLD4", "Basic Input/Output System"] +COMPONENT_DES_LIST = ["Used for managing the CPU", + "Used for managing QSFP+ ports (1-10)", "Used for managing QSFP+ ports (11-20)", "Used for managing QSFP+ ports (22-32)", "Basic Input/Output System"] class Component(ComponentBase): @@ -40,24 +40,9 @@ class Component(ComponentBase): def __init__(self, component_index): ComponentBase.__init__(self) self.index = component_index + self._api_helper = APIHelper() self.name = self.get_name() - def __run_command(self, command): - # Run bash command and print output to stdout - try: - process = subprocess.Popen( - shlex.split(command), stdout=subprocess.PIPE) - while True: - output = process.stdout.readline() - if output == '' and process.poll() is not None: - break - rc = process.poll() - if rc != 0: - return False - except: - return False - return True - def __get_bios_version(self): # Retrieves the BIOS firmware version try: diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py index c0724e9bb68..041812fc101 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py @@ -14,6 +14,7 @@ try: from sonic_platform_base.fan_base import FanBase + from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -38,13 +39,16 @@ "addr": "5b" }, } +NULL_VAL = "N/A" class Fan(FanBase): """Platform-specific Fan class""" def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): + FanBase.__init__(self) self.fan_index = fan_index + self._api_helper = APIHelper() self.fan_tray_index = fan_tray_index self.is_psu_fan = is_psu_fan if self.is_psu_fan: @@ -75,16 +79,6 @@ def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): {'prs': 14, 'dir': 19, 'color': {'red': 37, 'green': 38}}, # 4 {'prs': 12, 'dir': 17, 'color': {'red': 33, 'green': 34}}, # 5 ] - FanBase.__init__(self) - - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" def __write_txt_file(self, file_path, value): try: @@ -105,7 +99,7 @@ def __search_file_by_name(self, directory, file_name): def __get_gpio_base(self): for r in os.listdir(GPIO_DIR): label_path = os.path.join(GPIO_DIR, r, "label") - if "gpiochip" in r and GPIO_LABEL in self.__read_txt_file(label_path): + if "gpiochip" in r and GPIO_LABEL in self._api_helper.read_txt_file(label_path): return int(r[8:], 10) return 216 # Reserve @@ -113,7 +107,7 @@ def __get_gpio_value(self, pinnum): gpio_base = self.dx010_fan_gpio[0]['base'] gpio_dir = GPIO_DIR + '/gpio' + str(gpio_base+pinnum) gpio_file = gpio_dir + "/value" - retval = self.__read_txt_file(gpio_file) + retval = self._api_helper.read_txt_file(gpio_file) return retval.rstrip('\r\n') def __set_gpio_value(self, pinnum, value=0): @@ -154,7 +148,8 @@ def get_speed(self): fan_speed_sysfs_name = "fan{}_input".format(self.fan_index+1) fan_speed_sysfs_path = self.__search_file_by_name( self.psu_hwmon_path, fan_speed_sysfs_name) - fan_speed_rpm = self.__read_txt_file(fan_speed_sysfs_path) or 0 + fan_speed_rpm = self._api_helper.read_txt_file( + fan_speed_sysfs_path) or 0 fan_speed_raw = float(fan_speed_rpm)/PSU_FAN_MAX_RPM * 100 speed = math.ceil(float(fan_speed_rpm) * 100 / PSU_FAN_MAX_RPM) elif self.get_presence(): @@ -164,7 +159,7 @@ def get_speed(self): sysfs_path = "%s%s/%s" % ( EMC2305_PATH, device, EMC2305_FAN_INPUT) sysfs_path = sysfs_path.format(fan_index[self.fan_tray_index]) - raw = self.__read_txt_file(sysfs_path).strip('\r\n') + raw = self._api_helper.read_txt_file(sysfs_path).strip('\r\n') pwm = int(raw, 10) if raw else 0 speed = math.ceil(float(pwm * 100 / EMC2305_MAX_PWM)) @@ -183,19 +178,7 @@ def get_target_speed(self): 0 : when PWM mode is use pwm : when pwm mode is not use """ - target = 0 - if not self.is_psu_fan: - chip = self.emc2305_chip_mapping[self.fan_index] - device = chip['device'] - fan_index = chip['index_map'] - sysfs_path = "%s%s/%s" % ( - EMC2305_PATH, device, EMC2305_FAN_TARGET) - sysfs_path = sysfs_path.format(fan_index[self.fan_tray_index]) - raw = self.__read_txt_file(sysfs_path).strip('\r\n') - pwm = int(raw, 10) if raw else 0 - target = math.ceil(float(pwm) * 100 / EMC2305_MAX_PWM) - - return target + return 'N/A' def get_speed_tolerance(self): """ @@ -284,11 +267,59 @@ def get_name(self): def get_presence(self): """ - Retrieves the presence of the PSU + Retrieves the presence of the FAN Returns: - bool: True if PSU is present, False if not + bool: True if FAN is present, False if not """ present_str = self.__get_gpio_value( self.dx010_fan_gpio[self.fan_tray_index+1]['prs']) return int(present_str, 10) == 0 if not self.is_psu_fan else True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + if self.is_psu_fan: + return NULL_VAL + + model = NULL_VAL + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + if self.is_psu_fan: + return NULL_VAL + + serial = NULL_VAL + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + status = 1 + if self.is_psu_fan: + fan_fault_sysfs_name = "fan1_fault" + fan_fault_sysfs_path = self.__search_file_by_name( + self.psu_hwmon_path, fan_fault_sysfs_name) + status = self._api_helper.read_one_line_file(fan_fault_sysfs_path) + + elif self.get_presence(): + chip = self.emc2305_chip_mapping[self.fan_index] + device = chip['device'] + fan_index = chip['index_map'] + sysfs_path = "%s%s/%s" % ( + EMC2305_PATH, device, 'fan{}_fault') + sysfs_path = sysfs_path.format(fan_index[self.fan_tray_index]) + status = self._api_helper.read_one_line_file(sysfs_path) + + return False if int(status) != 0 else True diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/helper.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/helper.py new file mode 100644 index 00000000000..1f034be4a0b --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/helper.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python + +import os +import struct +import subprocess +from sonic_py_common import device_info +from mmap import * + +HOST_CHK_CMD = "docker > /dev/null 2>&1" +EMPTY_STRING = "" + + +class APIHelper(): + + def __init__(self): + (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() + + def is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def pci_get_value(self, resource, offset): + status = True + result = "" + try: + fd = os.open(resource, os.O_RDWR) + mm = mmap(fd, 0) + mm.seek(int(offset)) + read_data_stream = mm.read(4) + result = struct.unpack('I', read_data_stream) + except: + status = False + return status, result + + def run_command(self, cmd): + status = True + result = "" + try: + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + except: + status = False + return status, result + + def run_interactive_command(self, cmd): + try: + os.system(cmd) + except: + return False + return True + + def read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def read_one_line_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.readline() + return data.strip() + except IOError: + pass + return None + + def write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except Exception: + return False + return True + + def get_cpld_reg_value(self, getreg_path, register): + cmd = "echo {1} > {0}; cat {0}".format(getreg_path, register) + status, result = self.run_command(cmd) + return result if status else None + + def ipmi_raw(self, netfn, cmd): + status = True + result = "" + try: + cmd = "ipmitool raw {} {}".format(str(netfn), str(cmd)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except: + status = False + return status, result + + def ipmi_fru_id(self, id, key=None): + status = True + result = "" + try: + cmd = "ipmitool fru print {}".format(str( + id)) if not key else "ipmitool fru print {0} | grep '{1}' ".format(str(id), str(key)) + + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except: + status = False + return status, result + + def ipmi_set_ss_thres(self, id, threshold_key, value): + status = True + result = "" + try: + cmd = "ipmitool sensor thresh '{}' {} {}".format( + str(id), str(threshold_key), str(value)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except: + status = False + return status, result diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py index 8558b0b0cad..d34c130dd4b 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/psu.py @@ -14,6 +14,7 @@ try: from sonic_platform_base.psu_base import PsuBase from sonic_platform.fan import Fan + from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -41,6 +42,7 @@ class Psu(PsuBase): def __init__(self, psu_index): PsuBase.__init__(self) self.index = psu_index + self._api_helper = APIHelper() self.green_led_path = GREEN_LED_PATH.format(self.index+1) self.dx010_psu_gpio = [ {'base': self.__get_gpio_base()}, @@ -54,27 +56,18 @@ def __init__(self, psu_index): fan = Fan(fan_index, 0, is_psu_fan=True, psu_index=self.index) self._fan_list.append(fan) - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - def __search_file_by_contain(self, directory, search_str, file_start): for dirpath, dirnames, files in os.walk(directory): for name in files: file_path = os.path.join(dirpath, name) - if name.startswith(file_start) and search_str in self.__read_txt_file(file_path): + if name.startswith(file_start) and search_str in self._api_helper.read_txt_file(file_path): return file_path return None def __get_gpio_base(self): for r in os.listdir(GPIO_DIR): label_path = os.path.join(GPIO_DIR, r, "label") - if "gpiochip" in r and GPIO_LABEL in self.__read_txt_file(label_path): + if "gpiochip" in r and GPIO_LABEL in self._api_helper.read_txt_file(label_path): return int(r[8:], 10) return 216 # Reserve @@ -82,7 +75,7 @@ def __get_gpio_value(self, pinnum): gpio_base = self.dx010_psu_gpio[0]['base'] gpio_dir = GPIO_DIR + '/gpio' + str(gpio_base+pinnum) gpio_file = gpio_dir + "/value" - retval = self.__read_txt_file(gpio_file) + retval = self._api_helper.read_txt_file(gpio_file) return retval.rstrip('\r\n') def get_voltage(self): @@ -104,7 +97,7 @@ def get_voltage(self): in_num = filter(str.isdigit, basename) vout_path = os.path.join( dir_name, voltage_name.format(in_num)) - vout_val = self.__read_txt_file(vout_path) + vout_val = self._api_helper.read_txt_file(vout_path) psu_voltage = float(vout_val) / 1000 return psu_voltage @@ -127,7 +120,7 @@ def get_current(self): cur_num = filter(str.isdigit, basename) cur_path = os.path.join( dir_name, current_name.format(cur_num)) - cur_val = self.__read_txt_file(cur_path) + cur_val = self._api_helper.read_txt_file(cur_path) psu_current = float(cur_val) / 1000 return psu_current @@ -150,7 +143,7 @@ def get_power(self): pw_num = filter(str.isdigit, basename) pw_path = os.path.join( dir_name, current_name.format(pw_num)) - pw_val = self.__read_txt_file(pw_path) + pw_val = self._api_helper.read_txt_file(pw_path) psu_power = float(pw_val) / 1000000 return psu_power @@ -196,7 +189,7 @@ def get_status_led(self): Returns: A string, one of the predefined STATUS_LED_COLOR_* strings above """ - status = self.__read_txt_file(self.green_led_path) + status = self._api_helper.read_txt_file(self.green_led_path) status_str = { '255': self.STATUS_LED_COLOR_GREEN, '0': self.STATUS_LED_COLOR_OFF diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py index 330d925fd8a..9b447798ddd 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py @@ -8,27 +8,46 @@ # ############################################################################# -import os import time import subprocess -import sonic_device_util from ctypes import create_string_buffer try: from sonic_platform_base.sfp_base import SfpBase - from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId + from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.inf8628 import inf8628InterfaceId from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper + from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") INFO_OFFSET = 128 DOM_OFFSET = 0 +# definitions of the offset and width for values in XCVR info eeprom XCVR_INTFACE_BULK_OFFSET = 0 XCVR_INTFACE_BULK_WIDTH_QSFP = 20 -XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_TYPE_OFFSET = 0 +XCVR_TYPE_WIDTH = 1 +XCVR_EXT_TYPE_OFFSET = 1 +XCVR_EXT_TYPE_WIDTH = 1 +XCVR_CONNECTOR_OFFSET = 2 +XCVR_CONNECTOR_WIDTH = 1 +XCVR_COMPLIANCE_CODE_OFFSET = 3 +XCVR_COMPLIANCE_CODE_WIDTH = 8 +XCVR_ENCODING_OFFSET = 11 +XCVR_ENCODING_WIDTH = 1 +XCVR_NBR_OFFSET = 12 +XCVR_NBR_WIDTH = 1 +XCVR_EXT_RATE_SEL_OFFSET = 13 +XCVR_EXT_RATE_SEL_WIDTH = 1 +XCVR_CABLE_LENGTH_OFFSET = 14 XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_CABLE_LENGTH_WIDTH_SFP = 6 XCVR_VENDOR_NAME_OFFSET = 20 XCVR_VENDOR_NAME_WIDTH = 16 XCVR_VENDOR_OUI_OFFSET = 37 @@ -37,13 +56,29 @@ XCVR_VENDOR_PN_WIDTH = 16 XCVR_HW_REV_OFFSET = 56 XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_HW_REV_WIDTH_QSFP = 2 XCVR_HW_REV_WIDTH_SFP = 4 XCVR_VENDOR_SN_OFFSET = 68 XCVR_VENDOR_SN_WIDTH = 16 XCVR_VENDOR_DATE_OFFSET = 84 XCVR_VENDOR_DATE_WIDTH = 8 XCVR_DOM_CAPABILITY_OFFSET = 92 -XCVR_DOM_CAPABILITY_WIDTH = 1 +XCVR_DOM_CAPABILITY_WIDTH = 2 + +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 + +# definitions of the offset for values in OSFP info eeprom +OSFP_TYPE_OFFSET = 0 +OSFP_VENDOR_NAME_OFFSET = 129 +OSFP_VENDOR_PN_OFFSET = 148 +OSFP_HW_REV_OFFSET = 164 +OSFP_VENDOR_SN_OFFSET = 166 # Offset for values in QSFP eeprom QSFP_DOM_REV_OFFSET = 1 @@ -52,64 +87,112 @@ QSFP_TEMPE_WIDTH = 2 QSFP_VOLT_OFFSET = 26 QSFP_VOLT_WIDTH = 2 +QSFP_VERSION_COMPLIANCE_OFFSET = 1 +QSFP_VERSION_COMPLIANCE_WIDTH = 2 QSFP_CHANNL_MON_OFFSET = 34 QSFP_CHANNL_MON_WIDTH = 16 QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 -QSFP_CONTROL_OFFSET = 86 -QSFP_CONTROL_WIDTH = 8 +QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_MODULE_MONITOR_OFFSET = 0 +QSFP_MODULE_MONITOR_WIDTH = 9 QSFP_POWEROVERRIDE_OFFSET = 93 QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_POWEROVERRIDE_BIT = 0 +QSFP_POWERSET_BIT = 1 +QSFP_OPTION_VALUE_OFFSET = 192 +QSFP_OPTION_VALUE_WIDTH = 4 +QSFP_MODULE_UPPER_PAGE3_START = 384 QSFP_MODULE_THRESHOLD_OFFSET = 128 QSFP_MODULE_THRESHOLD_WIDTH = 24 -QSFP_CHANNEL_THRESHOLD_OFFSET = 176 -QSFP_CHANNEL_THRESHOLD_WIDTH = 16 +QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_WIDTH = 24 + +SFP_MODULE_ADDRA2_OFFSET = 256 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 56 +SFP_CHANNL_THRESHOLD_OFFSET = 112 +SFP_CHANNL_THRESHOLD_WIDTH = 2 + +SFP_TEMPE_OFFSET = 96 +SFP_TEMPE_WIDTH = 2 +SFP_VOLT_OFFSET = 98 +SFP_VOLT_WIDTH = 2 +SFP_CHANNL_MON_OFFSET = 100 +SFP_CHANNL_MON_WIDTH = 6 +SFP_CHANNL_STATUS_OFFSET = 110 +SFP_CHANNL_STATUS_WIDTH = 1 + qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', 'Length OM2(m)', 'Length OM1(m)', 'Length Cable Assembly(m)') +sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + +sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes', 'FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia', 'FibreChannelSpeed') + qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', 'Fibre Channel link length/Transmitter Technology', 'Fibre Channel transmission media', 'Fibre Channel Speed') +SFP_TYPE = "SFP" +QSFP_TYPE = "QSFP" +OSFP_TYPE = "OSFP" + +PORT_START = 1 +PORT_END = 56 +QSFP_PORT_START = 1 +QSFP_PORT_END = 32 + +SFP_I2C_START = 26 class Sfp(SfpBase): """Platform-specific Sfp class""" - # Port number - PORT_START = 1 - PORT_END = 32 - # Path to QSFP sysfs RESET_PATH = "/sys/devices/platform/dx010_cpld/qsfp_reset" LP_PATH = "/sys/devices/platform/dx010_cpld/qsfp_lpmode" PRS_PATH = "/sys/devices/platform/dx010_cpld/qsfp_modprs" PLATFORM_ROOT_PATH = "/usr/share/sonic/device" PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" - HOST_CHK_CMD = "docker > /dev/null 2>&1" - - PLATFORM = "x86_64-cel_seastone-r0" - HWSKU = "Seastone-DX010" def __init__(self, sfp_index): + SfpBase.__init__(self) # Init index self.index = sfp_index self.port_num = self.index + 1 + self.dom_supported = False + self.sfp_type, self.port_name = self.__get_sfp_info() + self._api_helper = APIHelper() + self.platform = self._api_helper.platform + self.hwsku = self._api_helper.hwsku # Init eeprom path eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' self.port_to_eeprom_mapping = {} - for x in range(self.PORT_START, self.PORT_END + 1): - p_num = x - 1 if self.PORT_START == 1 else x - self.port_to_eeprom_mapping[x] = eeprom_path.format(p_num + 26) + self.port_to_i2c_mapping = {} + + for x in range(PORT_START, PORT_END + 1): + self.port_to_i2c_mapping[x] = (SFP_I2C_START + x) - 1 + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path - self.info_dict_keys = ['type', 'hardwarerev', 'serialnum', 'manufacturename', 'modelname', 'Connector', 'encoding', 'ext_identifier', + self.info_dict_keys = ['type', 'hardware_rev', 'serial', 'manufacturer', 'model', 'connector', 'encoding', 'ext_identifier', 'ext_rateselect_compliance', 'cable_type', 'cable_length', 'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui'] self.dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', 'power_lpmode', 'tx_disable', 'tx_disable_channel', 'temperature', 'voltage', @@ -118,9 +201,21 @@ def __init__(self, sfp_index): self.threshold_dict_keys = ['temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', 'rxpowerhighalarm', 'rxpowerhighwarning', 'rxpowerlowalarm', 'rxpowerlowwarning', 'txpowerhighalarm', 'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning', 'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm', 'txbiaslowwarning'] - SfpBase.__init__(self) + self._dom_capability_detect() + + def __get_sfp_info(self): + port_name = "Unknown" + sfp_type = "Unknown" - def _convert_string_to_num(self, value_str): + if self.port_num >= QSFP_PORT_START and self.port_num <= QSFP_TYPE: + sfp_type = QSFP_TYPE + port_name = "QSFP" + str(self.port_num - QSFP_PORT_START + 1) + elif self.port_num >= SFP_PORT_START and self.port_num <= SFP_PORT_END: + sfp_type = SFP_TYPE + port_name = "SFP" + str(self.port_num - SFP_PORT_START + 1) + return sfp_type, port_name + + def __convert_string_to_num(self, value_str): if "-inf" in value_str: return 'N/A' elif "Unknown" in value_str: @@ -140,22 +235,10 @@ def _convert_string_to_num(self, value_str): else: return 'N/A' - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - return "" - - def __is_host(self): - return os.system(self.HOST_CHK_CMD) == 0 - def __get_path_to_port_config_file(self): - platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM]) - hwsku_path = "/".join([platform_path, self.HWSKU] - ) if self.__is_host() else self.PMON_HWSKU_PATH + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.platform]) + hwsku_path = "/".join([platform_path, self.hwsku] + ) if self._api_helper.is_host() else self.PMON_HWSKU_PATH return "/".join([hwsku_path, "port_config.ini"]) def __read_eeprom_specific_bytes(self, offset, num_bytes): @@ -180,6 +263,106 @@ def __read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw + def _dom_capability_detect(self): + if not self.get_presence(): + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + return + + if self.sfp_type == "QSFP": + self.calibration = 1 + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + offset = 128 + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qsfp_version_compliance_raw = self.__read_eeprom_specific_bytes( + QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) + qsfp_version_compliance = int( + qsfp_version_compliance_raw[0], 16) + dom_capability = sfpi_obj.parse_qsfp_dom_capability( + qsfp_dom_capability_raw, 0) + if qsfp_version_compliance >= 0x08: + self.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' + self.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' + else: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = True + + self.dom_supported = True + self.calibration = 1 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + qsfp_option_value_raw = self.__read_eeprom_specific_bytes( + QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) + if qsfp_option_value_raw is not None: + optional_capability = sfpd_obj.parse_option_params( + qsfp_option_value_raw, 0) + self.dom_tx_disable_supported = optional_capability[ + 'data']['TxDisable']['value'] == 'On' + dom_status_indicator = sfpd_obj.parse_dom_status_indicator( + qsfp_version_compliance_raw, 1) + self.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.qsfp_page3_available = False + + elif self.sfp_type == "SFP": + sfpi_obj = sff8472InterfaceId() + if sfpi_obj is None: + return None + sfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + XCVR_DOM_CAPABILITY_OFFSET, XCVR_DOM_CAPABILITY_WIDTH) + if sfp_dom_capability_raw is not None: + sfp_dom_capability = int(sfp_dom_capability_raw[0], 16) + self.dom_supported = (sfp_dom_capability & 0x40 != 0) + if self.dom_supported: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = True + self.dom_tx_power_supported = True + if sfp_dom_capability & 0x20 != 0: + self.calibration = 1 + elif sfp_dom_capability & 0x10 != 0: + self.calibration = 2 + else: + self.calibration = 0 + else: + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.dom_tx_disable_supported = ( + int(sfp_dom_capability_raw[1], 16) & 0x40 != 0) + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + def get_transceiver_info(self): """ Retrieves transceiver info of this SFP @@ -189,11 +372,11 @@ def get_transceiver_info(self): keys |Value Format |Information ---------------------------|---------------|---------------------------- type |1*255VCHAR |type of SFP - hardwarerev |1*255VCHAR |hardware version of SFP - serialnum |1*255VCHAR |serial number of the SFP - manufacturename |1*255VCHAR |SFP vendor name - modelname |1*255VCHAR |SFP model name - Connector |1*255VCHAR |connector information + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information encoding |1*255VCHAR |encoding information ext_identifier |1*255VCHAR |extend identifier ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance @@ -203,85 +386,183 @@ def get_transceiver_info(self): vendor_date |1*255VCHAR |vendor date vendor_oui |1*255VCHAR |vendor OUI ======================================================================== - """ - # check present status - sfpi_obj = sff8436InterfaceId() - if not self.get_presence() or not sfpi_obj: - return {} - - offset = INFO_OFFSET - - sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_INTFACE_BULK_OFFSET), XCVR_INTFACE_BULK_WIDTH_QSFP) - sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk( - sfp_interface_bulk_raw, 0) - - sfp_vendor_name_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) - sfp_vendor_name_data = sfpi_obj.parse_vendor_name( - sfp_vendor_name_raw, 0) - - sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) - sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( - sfp_vendor_pn_raw, 0) - - sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_HW_REV_OFFSET), XCVR_HW_REV_WIDTH_QSFP) - sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( - sfp_vendor_rev_raw, 0) - - sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) - sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( - sfp_vendor_sn_raw, 0) - - sfp_vendor_oui_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) - if sfp_vendor_oui_raw is not None: - sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui( - sfp_vendor_oui_raw, 0) - - sfp_vendor_date_raw = self.__read_eeprom_specific_bytes( - (offset + XCVR_VENDOR_DATE_OFFSET), XCVR_VENDOR_DATE_WIDTH) - sfp_vendor_date_data = sfpi_obj.parse_vendor_date( - sfp_vendor_date_raw, 0) - + """ + compliance_code_dict = {} transceiver_info_dict = dict.fromkeys(self.info_dict_keys, 'N/A') - compliance_code_dict = dict() + if not self.get_presence(): + return transceiver_info_dict + + # ToDo: OSFP tranceiver info parsing not fully supported. + # in inf8628.py lack of some memory map definition + # will be implemented when the inf8628 memory map ready + if self.sfp_type == OSFP_TYPE: + offset = 0 + vendor_rev_width = XCVR_HW_REV_WIDTH_OSFP + + sfpi_obj = inf8628InterfaceId() + if sfpi_obj is None: + return None + + sfp_type_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_TYPE_OFFSET), XCVR_TYPE_WIDTH) + if sfp_type_raw is not None: + sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + else: + return None + + sfp_vendor_name_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + if sfp_vendor_name_raw is not None: + sfp_vendor_name_data = sfpi_obj.parse_vendor_name( + sfp_vendor_name_raw, 0) + else: + return None + + sfp_vendor_pn_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + if sfp_vendor_pn_raw is not None: + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( + sfp_vendor_pn_raw, 0) + else: + return None + + sfp_vendor_rev_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_HW_REV_OFFSET), vendor_rev_width) + if sfp_vendor_rev_raw is not None: + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( + sfp_vendor_rev_raw, 0) + else: + return None + + sfp_vendor_sn_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + if sfp_vendor_sn_raw is not None: + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( + sfp_vendor_sn_raw, 0) + else: + return None + + transceiver_info_dict['type'] = sfp_type_data['data']['type']['value'] + transceiver_info_dict['manufacturename'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = 'N/A' + transceiver_info_dict['vendor_date'] = 'N/A' + transceiver_info_dict['Connector'] = 'N/A' + transceiver_info_dict['encoding'] = 'N/A' + transceiver_info_dict['ext_identifier'] = 'N/A' + transceiver_info_dict['ext_rateselect_compliance'] = 'N/A' + transceiver_info_dict['cable_type'] = 'N/A' + transceiver_info_dict['cable_length'] = 'N/A' + transceiver_info_dict['specification_compliance'] = '{}' + transceiver_info_dict['nominal_bit_rate'] = 'N/A' - if sfp_interface_bulk_data: + else: + if self.sfp_type == QSFP_TYPE: + offset = 128 + vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP + # cable_length_width = XCVR_CABLE_LENGTH_WIDTH_QSFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP + + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + else: + offset = 0 + vendor_rev_width = XCVR_HW_REV_WIDTH_SFP + # cable_length_width = XCVR_CABLE_LENGTH_WIDTH_SFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_SFP + + sfpi_obj = sff8472InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( + offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: + return None + + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date( + sfp_interface_bulk_raw[start: end], 0) transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['manufacturename'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ + 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] transceiver_info_dict['Connector'] = sfp_interface_bulk_data['data']['Connector']['value'] transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] - transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] - - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data[ - 'data']['Vendor Name']['value'] if sfp_vendor_name_data else 'N/A' - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] if sfp_vendor_pn_data else 'N/A' - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] if sfp_vendor_rev_data else 'N/A' - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] if sfp_vendor_sn_data else 'N/A' - transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] if sfp_vendor_oui_data else 'N/A' - transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ - 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] if sfp_vendor_date_data else 'N/A' - transceiver_info_dict['cable_type'] = "Unknown" - transceiver_info_dict['cable_length'] = "Unknown" - - for key in qsfp_cable_length_tup: - if key in sfp_interface_bulk_data['data']: - transceiver_info_dict['cable_type'] = key - transceiver_info_dict['cable_length'] = str( - sfp_interface_bulk_data['data'][key]['value']) - - for key in qsfp_compliance_code_tup: - if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: - compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] - transceiver_info_dict['specification_compliance'] = str( - compliance_code_dict) - transceiver_info_dict['nominal_bit_rate'] = str( - sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + + + if self.sfp_type == QSFP_TYPE: + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + else: + for key in sfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + for key in sfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value']) return transceiver_info_dict @@ -310,84 +591,117 @@ def get_transceiver_bulk_status(self): | |for example, tx2power stands for tx power of channel 2. ======================================================================== """ - # check present status - sfpd_obj = sff8436Dom() - sfpi_obj = sff8436InterfaceId() + transceiver_dom_info_dict = dict.fromkeys(self.dom_dict_keys, 'N/A') - if not self.get_presence() or not sfpi_obj or not sfpd_obj: - return {} + if self.sfp_type == OSFP_TYPE: + pass + + elif self.sfp_type == QSFP_TYPE: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_temp_supported: + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature( + dom_data_raw[start: end], 0) + temp = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage( + dom_data_raw[start: end], 0) + volt = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( + dom_data_raw[start: end], 0) + + if self.dom_tx_power_supported: + transceiver_dom_info_dict['tx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX4Power']['value']) + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX4Power']['value']) + + transceiver_dom_info_dict['tx1bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX1Bias']['value']) + transceiver_dom_info_dict['tx2bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX2Bias']['value']) + transceiver_dom_info_dict['tx3bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX3Bias']['value']) + transceiver_dom_info_dict['tx4bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX4Bias']['value']) - transceiver_dom_info_dict = dict.fromkeys(self.dom_dict_keys, 'N/A') - offset = DOM_OFFSET - offset_xcvr = INFO_OFFSET - - # QSFP capability byte parse, through this byte can know whether it support tx_power or not. - # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, - # need to add more code for determining the capability and version compliance - # in SFF-8636 dom capability definitions evolving with the versions. - qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( - (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) - if qsfp_dom_capability_raw is not None: - qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability( - qsfp_dom_capability_raw, 0) else: - return None + if not self.dom_supported: + return transceiver_dom_info_dict - dom_temperature_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature( - dom_temperature_raw, 0) - transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] - - dom_voltage_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] - - qsfp_dom_rev_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_DOM_REV_OFFSET), QSFP_DOM_REV_WIDTH) - if qsfp_dom_rev_raw is not None: - qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(qsfp_dom_rev_raw, 0) - qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value'] - - # The tx_power monitoring is only available on QSFP which compliant with SFF-8636 - # and claimed that it support tx_power with one indicator bit. - dom_channel_monitor_data = {} - dom_channel_monitor_raw = None - qsfp_tx_power_support = qspf_dom_capability_data['data']['Tx_power_support']['value'] - if (qsfp_dom_rev[0:8] != 'SFF-8636' or (qsfp_dom_rev[0:8] == 'SFF-8636' and qsfp_tx_power_support != 'on')): - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( - dom_channel_monitor_raw, 0) + offset = 256 + sfpd_obj = sff8472Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + sfpd_obj._calibration_type = self.calibration - else: - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( - dom_channel_monitor_raw, 0) - transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TX1Power']['value'] - transceiver_dom_info_dict['tx2power'] = dom_channel_monitor_data['data']['TX2Power']['value'] - transceiver_dom_info_dict['tx3power'] = dom_channel_monitor_data['data']['TX3Power']['value'] - transceiver_dom_info_dict['tx4power'] = dom_channel_monitor_data['data']['TX4Power']['value'] - - if dom_channel_monitor_raw: - transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RX1Power']['value'] - transceiver_dom_info_dict['rx2power'] = dom_channel_monitor_data['data']['RX2Power']['value'] - transceiver_dom_info_dict['rx3power'] = dom_channel_monitor_data['data']['RX3Power']['value'] - transceiver_dom_info_dict['rx4power'] = dom_channel_monitor_data['data']['RX4Power']['value'] - transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] - transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] - transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] - transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] - - for key in transceiver_dom_info_dict: - transceiver_dom_info_dict[key] = self._convert_string_to_num( - transceiver_dom_info_dict[key]) + dom_data_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_DOM_BULK_DATA_START), SFP_DOM_BULK_DATA_SIZE) + + start = SFP_TEMPE_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature( + dom_data_raw[start: end], 0) + + start = SFP_VOLT_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage( + dom_data_raw[start: end], 0) + + start = SFP_CHANNL_MON_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_CHANNL_MON_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( + dom_data_raw[start: end], 0) + + transceiver_dom_info_dict['temperature'] = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + transceiver_dom_info_dict['voltage'] = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + transceiver_dom_info_dict['rx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RXPower']['value']) + transceiver_dom_info_dict['tx1bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TXBias']['value']) + transceiver_dom_info_dict['tx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TXPower']['value']) transceiver_dom_info_dict['rx_los'] = self.get_rx_los() transceiver_dom_info_dict['tx_fault'] = self.get_tx_fault() @@ -426,55 +740,106 @@ def get_transceiver_threshold_info(self): txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. ======================================================================== """ - # check present status - sfpd_obj = sff8436Dom() + transceiver_dom_threshold_info_dict = dict.fromkeys( + self.threshold_dict_keys, 'N/A') - if not self.get_presence() or not sfpd_obj: - return {} + if self.sfp_type == OSFP_TYPE: + pass - transceiver_dom_threshold_dict = dict.fromkeys( - self.threshold_dict_keys, 'N/A') - dom_thres_raw = self.__read_eeprom_specific_bytes( - QSFP_MODULE_THRESHOLD_OFFSET, QSFP_MODULE_THRESHOLD_WIDTH) if self.get_presence() and sfpd_obj else None - - if dom_thres_raw: - module_threshold_values = sfpd_obj.parse_module_threshold_values( - dom_thres_raw, 0) - module_threshold_data = module_threshold_values.get('data') - if module_threshold_data: - transceiver_dom_threshold_dict['temphighalarm'] = module_threshold_data['TempHighAlarm']['value'] - transceiver_dom_threshold_dict['templowalarm'] = module_threshold_data['TempLowAlarm']['value'] - transceiver_dom_threshold_dict['temphighwarning'] = module_threshold_data['TempHighWarning']['value'] - transceiver_dom_threshold_dict['templowwarning'] = module_threshold_data['TempLowWarning']['value'] - transceiver_dom_threshold_dict['vcchighalarm'] = module_threshold_data['VccHighAlarm']['value'] - transceiver_dom_threshold_dict['vcclowalarm'] = module_threshold_data['VccLowAlarm']['value'] - transceiver_dom_threshold_dict['vcchighwarning'] = module_threshold_data['VccHighWarning']['value'] - transceiver_dom_threshold_dict['vcclowwarning'] = module_threshold_data['VccLowWarning']['value'] - - dom_thres_raw = self.__read_eeprom_specific_bytes( - QSFP_CHANNEL_THRESHOLD_OFFSET, QSFP_CHANNEL_THRESHOLD_WIDTH) if self.get_presence() and sfpd_obj else None - channel_threshold_values = sfpd_obj.parse_channel_threshold_values( - dom_thres_raw, 0) - channel_threshold_data = channel_threshold_values.get('data') - if channel_threshold_data: - transceiver_dom_threshold_dict['rxpowerhighalarm'] = channel_threshold_data['RxPowerHighAlarm']['value'] - transceiver_dom_threshold_dict['rxpowerlowalarm'] = channel_threshold_data['RxPowerLowAlarm']['value'] - transceiver_dom_threshold_dict['rxpowerhighwarning'] = channel_threshold_data['RxPowerHighWarning']['value'] - transceiver_dom_threshold_dict['rxpowerlowwarning'] = channel_threshold_data['RxPowerLowWarning']['value'] - transceiver_dom_threshold_dict['txpowerhighalarm'] = "0.0dBm" - transceiver_dom_threshold_dict['txpowerlowalarm'] = "0.0dBm" - transceiver_dom_threshold_dict['txpowerhighwarning'] = "0.0dBm" - transceiver_dom_threshold_dict['txpowerlowwarning'] = "0.0dBm" - transceiver_dom_threshold_dict['txbiashighalarm'] = channel_threshold_data['TxBiasHighAlarm']['value'] - transceiver_dom_threshold_dict['txbiaslowalarm'] = channel_threshold_data['TxBiasLowAlarm']['value'] - transceiver_dom_threshold_dict['txbiashighwarning'] = channel_threshold_data['TxBiasHighWarning']['value'] - transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value'] - - for key in transceiver_dom_threshold_dict: - transceiver_dom_threshold_dict[key] = self._convert_string_to_num( - transceiver_dom_threshold_dict[key]) - - return transceiver_dom_threshold_dict + elif self.sfp_type == QSFP_TYPE: + if not self.dom_supported or not self.qsfp_page3_available: + return transceiver_dom_threshold_info_dict + + # Dom Threshold data starts from offset 384 + # Revert offset back to 0 once data is retrieved + offset = QSFP_MODULE_UPPER_PAGE3_START + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values( + dom_module_threshold_raw, 0) + + dom_channel_threshold_raw = self.__read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), + QSFP_CHANNL_THRESHOLD_WIDTH) + if dom_channel_threshold_raw is None: + return transceiver_dom_threshold_info_dict + dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values( + dom_channel_threshold_raw, 0) + + # Threshold Data + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] + + else: + offset = SFP_MODULE_ADDRA2_OFFSET + + if not self.dom_supported: + return transceiver_dom_threshold_info_dict + + sfpd_obj = sff8472Dom(None, self.calibration) + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes((offset + SFP_MODULE_THRESHOLD_OFFSET), + SFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is not None: + dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold( + dom_module_threshold_raw, 0) + else: + return transceiver_dom_threshold_info_dict + + # Threshold Data + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data[ + 'data']['VoltageHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VoltageLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['BiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['BiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TXPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value'] + + for key in transceiver_dom_threshold_info_dict: + transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num( + transceiver_dom_threshold_info_dict[key]) + + return transceiver_dom_threshold_info_dict def get_reset_status(self): """ @@ -482,7 +847,7 @@ def get_reset_status(self): Returns: A Boolean, True if reset enabled, False if disabled """ - reset_status_raw = self.__read_txt_file(self.RESET_PATH).rstrip() + reset_status_raw = self._api_helper.read_txt_file(self.RESET_PATH).rstrip() if not reset_status_raw: return False @@ -498,16 +863,28 @@ def get_rx_los(self): Note : RX LOS status is latched until a call to get_rx_los or a reset. """ rx_los = False - rx_los_list = [] - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - QSFP_CHANNL_RX_LOS_STATUS_OFFSET, QSFP_CHANNL_RX_LOS_STATUS_WIDTH) if self.get_presence() else None - if dom_channel_monitor_raw is not None: - rx_los_data = int(dom_channel_monitor_raw[0], 16) - rx_los_list.append(rx_los_data & 0x01 != 0) - rx_los_list.append(rx_los_data & 0x02 != 0) - rx_los_list.append(rx_los_data & 0x04 != 0) - rx_los_list.append(rx_los_data & 0x08 != 0) - rx_los = rx_los_list[0] and rx_los_list[1] and rx_los_list[2] and rx_los_list[3] + if self.sfp_type == OSFP_TYPE: + return False + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx1_los = (rx_los_data & 0x01 != 0) + rx2_los = (rx_los_data & 0x02 != 0) + rx3_los = (rx_los_data & 0x04 != 0) + rx4_los = (rx_los_data & 0x08 != 0) + rx_los = (rx1_los and rx2_los and rx3_los and rx4_los) + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los = (rx_los_data & 0x02 != 0) + return rx_los def get_tx_fault(self): @@ -517,19 +894,32 @@ def get_tx_fault(self): A Boolean, True if SFP has TX fault, False if not Note : TX fault status is lached until a call to get_tx_fault or a reset. """ - tx_fault = False - tx_fault_list = [] - dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) if self.get_presence() else None - if dom_channel_monitor_raw is not None: - tx_fault_data = int(dom_channel_monitor_raw[0], 16) - tx_fault_list.append(tx_fault_data & 0x01 != 0) - tx_fault_list.append(tx_fault_data & 0x02 != 0) - tx_fault_list.append(tx_fault_data & 0x04 != 0) - tx_fault_list.append(tx_fault_data & 0x08 != 0) - tx_fault = tx_fault_list[0] and tx_fault_list[1] and tx_fault_list[2] and tx_fault_list[3] + tx4_fault = False + + if self.sfp_type == OSFP_TYPE or not self.dom_supported: + return False + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx1_fault = (tx_fault_data & 0x01 != 0) + tx2_fault = (tx_fault_data & 0x02 != 0) + tx3_fault = (tx_fault_data & 0x04 != 0) + tx4_fault = (tx_fault_data & 0x08 != 0) + tx4_fault = ( + tx1_fault and tx2_fault and tx3_fault and tx4_fault) + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx4_fault = (tx_fault_data & 0x04 != 0) - return tx_fault + return tx4_fault def get_tx_disable(self): """ @@ -537,26 +927,33 @@ def get_tx_disable(self): Returns: A Boolean, True if tx_disable is enabled, False if disabled """ - tx_disable_list = [] - sfpd_obj = sff8436Dom() - if sfpd_obj is None: + tx_disable = False + + if self.sfp_type == OSFP_TYPE and not self.dom_supported: return False - dom_control_raw = self.__read_eeprom_specific_bytes( - QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None - if dom_control_raw is not None: - dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX1Disable']['value']) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX2Disable']['value']) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX3Disable']['value']) - tx_disable_list.append( - 'On' == dom_control_data['data']['TX4Disable']['value']) - - return tx_disable_list + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx1_disable = (tx_disable_data & 0x01 != 0) + tx2_disable = (tx_disable_data & 0x02 != 0) + tx3_disable = (tx_disable_data & 0x04 != 0) + tx4_disable = (tx_disable_data & 0x08 != 0) + tx_disable = ( + tx1_disable and tx2_disable and tx3_disable and tx4_disable) + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable = (tx_disable_data & 0xC0 != 0) + + return tx_disable def get_tx_disable_channel(self): """ @@ -567,9 +964,29 @@ def get_tx_disable_channel(self): As an example, a returned value of 0x5 indicates that channel 0 and channel 2 have been disabled. """ - tx_disable_list = self.get_tx_disable() - if tx_disable_list is None: - return 0 + tx_disable_list = [False, False, False, False] + + if self.sfp_type == OSFP_TYPE: + pass + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list[0] = (tx_disable_data & 0x01 != 0) + tx_disable_list[1] = (tx_disable_data & 0x02 != 0) + tx_disable_list[2] = (tx_disable_data & 0x04 != 0) + tx_disable_list[3] = (tx_disable_data & 0x08 != 0) + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list[0] = (tx_disable_data & 0xC0 != 0) + tx_disabled = 0 for i in range(len(tx_disable_list)): if tx_disable_list[i]: @@ -610,30 +1027,31 @@ def get_power_override(self): Returns: A Boolean, True if power-override is enabled, False if disabled """ - power_override = False - - offset = 0 - sfpd_obj = sff8436Dom() - if sfpd_obj is None: + if self.sfp_type == QSFP_TYPE: + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes( + dom_control_raw, 0) + power_override = ( + 'On' == dom_control_data['data']['PowerOverride']['value']) + return power_override + else: return False - dom_control_raw = self.__read_eeprom_specific_bytes( - QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None - if dom_control_raw is not None: - dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) - power_override = ( - 'On' == dom_control_data['data']['PowerOverride']['value']) - - return power_override - def get_temperature(self): """ Retrieves the temperature of this SFP Returns: An integer number of current temperature in Celsius """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - return transceiver_dom_info_dict.get("temperature", "N/A") + transceiver_bulk_status = self.get_transceiver_bulk_status() + return transceiver_bulk_status.get("temperature", "N/A") def get_voltage(self): """ @@ -641,8 +1059,8 @@ def get_voltage(self): Returns: An integer number of supply voltage in mV """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - return transceiver_dom_info_dict.get("voltage", "N/A") + transceiver_bulk_status = self.get_transceiver_bulk_status() + return transceiver_bulk_status.get("voltage", "N/A") def get_tx_bias(self): """ @@ -652,12 +1070,13 @@ def get_tx_bias(self): for channel 0 to channel 4. Ex. ['110.09', '111.12', '108.21', '112.09'] """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - tx1_bs = transceiver_dom_info_dict.get("tx1bias", "N/A") - tx2_bs = transceiver_dom_info_dict.get("tx2bias", "N/A") - tx3_bs = transceiver_dom_info_dict.get("tx3bias", "N/A") - tx4_bs = transceiver_dom_info_dict.get("tx4bias", "N/A") - return [tx1_bs, tx2_bs, tx3_bs, tx4_bs] if transceiver_dom_info_dict else [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + tx1_bs = transceiver_bulk_status.get("tx1bias", "N/A") + tx2_bs = transceiver_bulk_status.get("tx2bias", "N/A") + tx3_bs = transceiver_bulk_status.get("tx3bias", "N/A") + tx4_bs = transceiver_bulk_status.get("tx4bias", "N/A") + tx_bias_list = [tx1_bs, tx2_bs, tx3_bs, tx4_bs] + return tx_bias_list def get_rx_power(self): """ @@ -667,12 +1086,14 @@ def get_rx_power(self): power in mW for channel 0 to channel 4. Ex. ['1.77', '1.71', '1.68', '1.70'] """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - rx1_pw = transceiver_dom_info_dict.get("rx1power", "N/A") - rx2_pw = transceiver_dom_info_dict.get("rx2power", "N/A") - rx3_pw = transceiver_dom_info_dict.get("rx3power", "N/A") - rx4_pw = transceiver_dom_info_dict.get("rx4power", "N/A") - return [rx1_pw, rx2_pw, rx3_pw, rx4_pw] if transceiver_dom_info_dict else [] + rx_power_list = [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + rx1_p = transceiver_bulk_status.get("rx1power", "N/A") + rx2_p = transceiver_bulk_status.get("rx2power", "N/A") + rx3_p = transceiver_bulk_status.get("rx3power", "N/A") + rx4_p = transceiver_bulk_status.get("rx4power", "N/A") + rx_power_list = [rx1_p, rx2_p, rx3_p, rx4_p] + return rx_power_list def get_tx_power(self): """ @@ -682,12 +1103,14 @@ def get_tx_power(self): for channel 0 to channel 4. Ex. ['1.86', '1.86', '1.86', '1.86'] """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() - tx1_pw = transceiver_dom_info_dict.get("tx1power", "N/A") - tx2_pw = transceiver_dom_info_dict.get("tx2power", "N/A") - tx3_pw = transceiver_dom_info_dict.get("tx3power", "N/A") - tx4_pw = transceiver_dom_info_dict.get("tx4power", "N/A") - return [tx1_pw, tx2_pw, tx3_pw, tx4_pw] + tx_power_list = [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + tx1_p = transceiver_bulk_status.get("tx1power", "N/A") + tx2_p = transceiver_bulk_status.get("tx2power", "N/A") + tx3_p = transceiver_bulk_status.get("tx3power", "N/A") + tx4_p = transceiver_bulk_status.get("tx4power", "N/A") + tx_power_list = [tx1_p, tx2_p, tx3_p, tx4_p] + return tx_power_list def reset(self): """ @@ -749,24 +1172,26 @@ def tx_disable(self, tx_disable): Returns: A boolean, True if tx_disable is set successfully, False if not """ - sysfsfile_eeprom = None - try: - tx_disable_ctl = 0xf if tx_disable else 0x0 - buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) - # Write to eeprom - sysfsfile_eeprom = open( - self.port_to_eeprom_mapping[self.port_num], "r+b") - sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) - sysfsfile_eeprom.write(buffer[0]) - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - finally: - if sysfsfile_eeprom is not None: - sysfsfile_eeprom.close() - time.sleep(0.01) - return True + if self.sfp_type == QSFP_TYPE: + sysfsfile_eeprom = None + try: + tx_disable_ctl = 0xf if tx_disable else 0x0 + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + #print("Error: unable to open file: %s" % str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + return False def tx_disable_channel(self, channel, disable): """ @@ -779,28 +1204,30 @@ def tx_disable_channel(self, channel, disable): Returns: A boolean, True if successful, False if not """ - sysfsfile_eeprom = None - try: - channel_state = self.get_tx_disable_channel() - tx_enable_mask = [0xe, 0xd, 0xb, 0x7] - tx_disable_mask = [0x1, 0x3, 0x7, 0xf] - tx_disable_ctl = channel_state | tx_disable_mask[ - channel] if disable else channel_state & tx_enable_mask[channel] - buffer = create_string_buffer(1) - buffer[0] = chr(tx_disable_ctl) - # Write to eeprom - sysfsfile_eeprom = open( - self.port_to_eeprom_mapping[self.port_num], "r+b") - sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) - sysfsfile_eeprom.write(buffer[0]) - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - finally: - if sysfsfile_eeprom is not None: - sysfsfile_eeprom.close() - time.sleep(0.01) - return True + if self.sfp_type == QSFP_TYPE: + sysfsfile_eeprom = None + try: + channel_state = self.get_tx_disable_channel() + tx_enable_mask = [0xe, 0xd, 0xb, 0x7] + tx_disable_mask = [0x1, 0x3, 0x7, 0xf] + tx_disable_ctl = channel_state | tx_disable_mask[ + channel] if disable else channel_state & tx_enable_mask[channel] + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + #print("Error: unable to open file: %s" % str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + return False def set_lpmode(self, lpmode): """ @@ -856,30 +1283,36 @@ def set_power_override(self, power_override, power_set): A boolean, True if power-override and power_set are set successfully, False if not """ - try: - power_override_bit = 0 - if power_override: - power_override_bit |= 1 << 0 - - power_set_bit = 0 - if power_set: - power_set_bit |= 1 << 1 + if self.sfp_type == QSFP_TYPE: + try: + power_override_bit = 0 + if power_override: + power_override_bit |= 1 << 0 + + power_set_bit = 0 + if power_set: + power_set_bit |= 1 << 1 + + buffer = create_string_buffer(1) + buffer[0] = chr(power_override_bit | power_set_bit) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + #print("Error: unable to open file: %s" % str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + return False - buffer = create_string_buffer(1) - buffer[0] = chr(power_override_bit | power_set_bit) - # Write to eeprom - sysfsfile_eeprom = open( - self.port_to_eeprom_mapping[self.port_num], "r+b") - sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) - sysfsfile_eeprom.write(buffer[0]) - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - finally: - if sysfsfile_eeprom is not None: - sysfsfile_eeprom.close() - time.sleep(0.01) - return True + ############################################################## + ###################### Device methods ######################## + ############################################################## def get_name(self): """ @@ -899,7 +1332,7 @@ def get_presence(self): Returns: bool: True if PSU is present, False if not """ - presence_status_raw = self.__read_txt_file(self.PRS_PATH).rstrip() + presence_status_raw = self._api_helper.read_txt_file(self.PRS_PATH).rstrip() if not presence_status_raw: return False @@ -925,7 +1358,7 @@ def get_model(self): string: Model/part number of device """ transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("modelname", "N/A") + return transceiver_dom_info_dict.get("model", "N/A") def get_serial(self): """ @@ -934,7 +1367,7 @@ def get_serial(self): string: Serial number of device """ transceiver_dom_info_dict = self.get_transceiver_info() - return transceiver_dom_info_dict.get("serialnum", "N/A") + return transceiver_dom_info_dict.get("serial", "N/A") def get_status(self): """ diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py index 1e0a2c4b564..58957442e03 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py @@ -14,56 +14,79 @@ try: from sonic_platform_base.thermal_base import ThermalBase + from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") +THERMAL_INFO = { + 0: { + "F2B_max": 50, + "B2F_max": 55, + "postion": "asic", + "name": "Front-panel temp sensor 1", + "i2c_path": "i2c-5/5-0048/hwmon/hwmon1", # u4 system-inlet + }, + 1: { + "F2B_max": 50, + "B2F_max": 55, + "postion": "asic", + "name": "Front-panel temp sensor 2", + "i2c_path": "i2c-6/6-0049/hwmon/hwmon2", # u2 system-inlet + }, + 2: { + "F2B_max": 70, + "F2B_max_crit": 75, + "B2F_max": 60, + "B2F_max_crit": 65, + "postion": "asic", + "name": "ASIC temp sensor", + "i2c_path": "i2c-7/7-004a/hwmon/hwmon3", # u44 bmc56960-on-board + }, + 3: { + "F2B_max": 70, + "F2B_max_crit": 75, + "B2F_max": 70, + "B2F_max_crit": 75, + "postion": "cpu", + "name": "Rear-panel temp sensor 1", + "i2c_path": "i2c-14/14-0048/hwmon/hwmon4", # u9200 cpu-on-board + }, + 4: { + "F2B_max": 70, + "B2F_max": 55, + "postion": "cpu", + "name": "Rear-panel temp sensor 2", + "i2c_path": "i2c-15/15-004e/hwmon/hwmon5" # u9201 system-outlet + } +} +NULL_VAL = "N/A" +I2C_ADAPTER_PATH = "/sys/class/i2c-adapter" + class Thermal(ThermalBase): """Platform-specific Thermal class""" - THERMAL_NAME_LIST = [] - I2C_ADAPTER_PATH = "/sys/class/i2c-adapter" SS_CONFIG_PATH = "/usr/share/sonic/device/x86_64-cel_seastone-r0/sensors.conf" - def __init__(self, thermal_index): + def __init__(self, thermal_index, airflow): self.index = thermal_index - - # Add thermal name - self.THERMAL_NAME_LIST.append("Front-panel temp sensor 1") - self.THERMAL_NAME_LIST.append("Front-panel temp sensor 2") - self.THERMAL_NAME_LIST.append("ASIC temp sensor") - self.THERMAL_NAME_LIST.append("Rear-panel temp sensor 1") - self.THERMAL_NAME_LIST.append("Rear-panel temp sensor 2") - - # Set hwmon path - i2c_path = { - 0: "i2c-5/5-0048/hwmon/hwmon1", # u4 system-inlet - 1: "i2c-6/6-0049/hwmon/hwmon2", # u2 system-inlet - 2: "i2c-7/7-004a/hwmon/hwmon3", # u44 bmc56960-on-board - 3: "i2c-14/14-0048/hwmon/hwmon4", # u9200 cpu-on-board - 4: "i2c-15/15-004e/hwmon/hwmon5" # u9201 system-outlet - }.get(self.index, None) - - self.hwmon_path = "{}/{}".format(self.I2C_ADAPTER_PATH, i2c_path) - self.ss_key = self.THERMAL_NAME_LIST[self.index] + self._api_helper = APIHelper() + self._airflow = airflow + self._thermal_info = THERMAL_INFO[self.index] + self._hwmon_path = "{}/{}".format(I2C_ADAPTER_PATH, + self._thermal_info["i2c_path"]) + self.name = self.get_name() + self.postion = self._thermal_info["postion"] self.ss_index = 1 - def __read_txt_file(self, file_path): - try: - with open(file_path, 'r') as fd: - data = fd.read() - return data.strip() - except IOError: - pass - def __get_temp(self, temp_file): - temp_file_path = os.path.join(self.hwmon_path, temp_file) - raw_temp = self.__read_txt_file(temp_file_path) + temp_file_path = os.path.join(self._hwmon_path, temp_file) + raw_temp = self._api_helper.read_txt_file(temp_file_path) temp = float(raw_temp)/1000 - return "{:.3f}".format(temp) + return float("{:.3f}".format(temp)) def __set_threshold(self, file_name, temperature): - temp_file_path = os.path.join(self.hwmon_path, file_name) + temp_file_path = os.path.join(self._hwmon_path, file_name) try: with open(temp_file_path, 'w') as fd: fd.write(str(temperature)) @@ -88,8 +111,17 @@ def get_high_threshold(self): A float number, the high threshold temperature of thermal in Celsius up to nearest thousandth of one degree Celsius, e.g. 30.125 """ - temp_file = "temp{}_max".format(self.ss_index) - return self.__get_temp(temp_file) + max_crit_key = '{}_max'.format(self._airflow) + return self._thermal_info.get(max_crit_key, None) + + 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 set_high_threshold(self, temperature): """ @@ -110,7 +142,7 @@ def set_high_threshold(self, temperature): f.seek(0) ss_found = False for idx, val in enumerate(content): - if self.ss_key in val: + if self.name in val: ss_found = True elif ss_found and temp_file in val: content[idx] = " set {} {}\n".format( @@ -123,13 +155,43 @@ def set_high_threshold(self, temperature): return is_set & file_set + 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 + """ + return False + + 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 + """ + max_crit_key = '{}_max_crit'.format(self._airflow) + return self._thermal_info.get(max_crit_key, None) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return 0.0 + def get_name(self): """ Retrieves the name of the thermal device Returns: string: The name of the thermal device """ - return self.THERMAL_NAME_LIST[self.index] + return self._thermal_info["name"] def get_presence(self): """ @@ -138,9 +200,25 @@ def get_presence(self): bool: True if PSU is present, False if not """ temp_file = "temp{}_input".format(self.ss_index) - temp_file_path = os.path.join(self.hwmon_path, temp_file) + temp_file_path = os.path.join(self._hwmon_path, temp_file) return os.path.isfile(temp_file_path) + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return NULL_VAL + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return NULL_VAL + def get_status(self): """ Retrieves the operational status of the device @@ -151,7 +229,7 @@ def get_status(self): return False fault_file = "temp{}_fault".format(self.ss_index) - fault_file_path = os.path.join(self.hwmon_path, fault_file) + fault_file_path = os.path.join(self._hwmon_path, fault_file) if not os.path.isfile(fault_file_path): return True diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_actions.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_actions.py new file mode 100644 index 00000000000..545db861f68 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_actions.py @@ -0,0 +1,78 @@ + +from sonic_platform_base.sonic_thermal_control.thermal_action_base import ThermalPolicyActionBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object +from .thermal_infos import ChassisInfo +from .helper import APIHelper + + +@thermal_json_object('thermal_control.control') +class ControlThermalAlgoAction(ThermalPolicyActionBase): + """ + Action to control the thermal control algorithm + """ + # JSON field definition + JSON_FIELD_STATUS = 'status' + + def __init__(self): + self.status = True + + def load_from_json(self, json_obj): + """ + Construct ControlThermalAlgoAction via JSON. JSON example: + { + "type": "thermal_control.control" + "status": "true" + } + :param json_obj: A JSON object representing a ControlThermalAlgoAction action. + :return: + """ + if ControlThermalAlgoAction.JSON_FIELD_STATUS in json_obj: + status_str = json_obj[ControlThermalAlgoAction.JSON_FIELD_STATUS].lower() + if status_str == 'true': + self.status = True + elif status_str == 'false': + self.status = False + else: + raise ValueError('Invalid {} field value, please specify true of false'. + format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) + else: + raise ValueError('ControlThermalAlgoAction ' + 'missing mandatory field {} in JSON policy file'. + format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) + + def execute(self, thermal_info_dict): + """ + Disable thermal control algorithm + :param thermal_info_dict: A dictionary stores all thermal information. + :return: + """ + if ChassisInfo.INFO_NAME in thermal_info_dict: + chassis_info_obj = thermal_info_dict[ChassisInfo.INFO_NAME] + chassis = chassis_info_obj.get_chassis() + thermal_manager = chassis.get_thermal_manager() + if self.status: + thermal_manager.start_thermal_control_algorithm() + else: + thermal_manager.stop_thermal_control_algorithm() + + +@thermal_json_object('switch.power_cycling') +class SwitchPolicyAction(ThermalPolicyActionBase): + """ + Base class for thermal action. Once all thermal conditions in a thermal policy are matched, + all predefined thermal action will be executed. + """ + + def execute(self, thermal_info_dict): + """ + Take action when thermal condition matches. For example, power cycle the switch. + :param thermal_info_dict: A dictionary stores all thermal information. + :return: + """ + thermal_overload_position_path = '/tmp/thermal_overload_position' + thermal_overload_position = APIHelper().read_one_line_file( + thermal_overload_position_path) + + cmd = 'bash /usr/share/sonic/platform/thermal_overload_control.sh {}'.format( + thermal_overload_position) + APIHelper().run_command(cmd) diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_conditions.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_conditions.py new file mode 100644 index 00000000000..1eee8ea91ab --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_conditions.py @@ -0,0 +1,77 @@ +from sonic_platform_base.sonic_thermal_control.thermal_condition_base import ThermalPolicyConditionBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object + + +class FanCondition(ThermalPolicyConditionBase): + def get_fan_info(self, thermal_info_dict): + from .thermal_infos import FanInfo + if FanInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[FanInfo.INFO_NAME], FanInfo): + return thermal_info_dict[FanInfo.INFO_NAME] + else: + return None + + +@thermal_json_object('fan.any.absence') +class AnyFanAbsenceCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_absence_fans()) > 0 if fan_info_obj else False + + +@thermal_json_object('fan.any.fault') +class AnyFanFaultCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_fault_fans()) > 0 if fan_info_obj else False + + +@thermal_json_object('fan.all.presence') +class AllFanPresenceCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_absence_fans()) == 0 if fan_info_obj else False + + +@thermal_json_object('fan.all.good') +class AllFanGoodCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_fault_fans()) == 0 if fan_info_obj else False + + +class ThermalCondition(ThermalPolicyConditionBase): + def get_thermal_info(self, thermal_info_dict): + from .thermal_infos import ThermalInfo + if ThermalInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo): + return thermal_info_dict[ThermalInfo.INFO_NAME] + else: + return None + + +@thermal_json_object('thermal.over.high_threshold') +class ThermalOverHighCriticalCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return thermal_info_obj.is_over_high_threshold() + else: + return False + + +@thermal_json_object('thermal.over.high_critical_threshold') +class ThermalOverHighCriticalCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return thermal_info_obj.is_over_high_critical_threshold() + else: + return False + +@thermal_json_object('thermal.all.good') +class ThermalGoodCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return not thermal_info_obj.is_over_threshold() + else: + return False diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_infos.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_infos.py new file mode 100644 index 00000000000..a680b31b634 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_infos.py @@ -0,0 +1,165 @@ +from sonic_platform_base.sonic_thermal_control.thermal_info_base import ThermalPolicyInfoBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object +from .helper import APIHelper +import time + + +@thermal_json_object('fan_info') +class FanInfo(ThermalPolicyInfoBase): + """ + Fan information needed by thermal policy + """ + + # Fan information name + INFO_NAME = 'fan_info' + + def __init__(self): + self._absence_fans = set() + self._presence_fans = set() + self._fault_fans = set() + self._status_changed = False + + def collect(self, chassis): + """ + Collect absence and presence fans. + :param chassis: The chassis object + :return: + """ + self._status_changed = False + for fan in chassis.get_all_fans(): + presence = fan.get_presence() + status = fan.get_status() + if presence and fan not in self._presence_fans: + self._presence_fans.add(fan) + self._status_changed = True + if fan in self._absence_fans: + self._absence_fans.remove(fan) + elif not presence and fan not in self._absence_fans: + self._absence_fans.add(fan) + self._status_changed = True + if fan in self._presence_fans: + self._presence_fans.remove(fan) + + if not status and fan not in self._fault_fans: + self._fault_fans.add(fan) + self._status_changed = True + + elif status and fan in self._fault_fans: + self._fault_fans.remove(fan) + self._status_changed = True + + def get_absence_fans(self): + """ + Retrieves absence fans + :return: A set of absence fans + """ + return self._absence_fans + + def get_presence_fans(self): + """ + Retrieves presence fans + :return: A set of presence fans + """ + return self._presence_fans + + def get_fault_fans(self): + """ + Retrieves fault fans + :return: A set of fault fans + """ + return self._fault_fans + + def is_status_changed(self): + """ + Retrieves if the status of fan information changed + :return: True if status changed else False + """ + return self._status_changed + + +@thermal_json_object('thermal_info') +class ThermalInfo(ThermalPolicyInfoBase): + """ + Thermal information needed by thermal policy + """ + + # Fan information name + INFO_NAME = 'thermal_info' + + def collect(self, chassis): + """ + Collect thermal sensor temperature change status + :param chassis: The chassis object + :return: + """ + self._over_high_threshold = False + self._over_high_critical_threshold = False + self._thermal_overload_position = 'cpu' + + # Calculate average temp within the device + temp = 0 + num_of_thermals = chassis.get_num_thermals() + for index in range(num_of_thermals): + thermal = chassis.get_thermal(index) + temp = thermal.get_temperature() + high_threshold = thermal.get_high_threshold() + high_critical_threshold = thermal.get_high_critical_threshold() + + if high_threshold and temp > high_threshold: + self._over_high_threshold = True + + if high_critical_threshold and temp > high_critical_threshold: + self._thermal_overload_position = thermal.postion + self._over_high_critical_threshold = True + + def is_over_threshold(self): + """ + Retrieves if the temperature is over any threshold + :return: True if the temperature is over any threshold else False + """ + return self._over_high_threshold or self._over_high_critical_threshold + + def is_over_high_critical_threshold(self): + """ + Retrieves if the temperature is over high critical threshold + :return: True if the temperature is over high critical threshold else False + """ + thermal_overload_position_path = '/tmp/thermal_overload_position' + if self._over_high_critical_threshold: + APIHelper().write_txt_file(thermal_overload_position_path, + self._thermal_overload_position) + time.sleep(1) + return self._over_high_critical_threshold + + def is_over_high_threshold(self): + """ + Retrieves if the temperature is over high threshold + :return: True if the temperature is over high threshold else False + """ + return self._over_high_threshold + + +@thermal_json_object('chassis_info') +class ChassisInfo(ThermalPolicyInfoBase): + """ + Chassis information needed by thermal policy + """ + INFO_NAME = 'chassis_info' + + def __init__(self): + self._chassis = None + + def collect(self, chassis): + """ + Collect platform chassis. + :param chassis: The chassis object + :return: + """ + self._chassis = chassis + + def get_chassis(self): + """ + Retrieves platform chassis object + :return: A platform chassis object. + """ + return self._chassis diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_manager.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_manager.py new file mode 100644 index 00000000000..9f057cf1f37 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal_manager.py @@ -0,0 +1,46 @@ +from sonic_platform_base.sonic_thermal_control.thermal_manager_base import ThermalManagerBase +from .helper import APIHelper +from .thermal_actions import * +from .thermal_conditions import * +from .thermal_infos import * + +class ThermalManager(ThermalManagerBase): + FSC_ALGORITHM_CMD = 'service fancontrol {}' + + @classmethod + def start_thermal_control_algorithm(cls): + """ + Start vendor specific thermal control algorithm. The default behavior of this function is a no-op. + :return: + """ + return cls._enable_fancontrol_service(True) + + @classmethod + def stop_thermal_control_algorithm(cls): + """ + Stop thermal control algorithm + Returns: + bool: True if set success, False if fail. + """ + return cls._enable_fancontrol_service(False) + + @classmethod + def deinitialize(cls): + """ + Destroy thermal manager, including any vendor specific cleanup. The default behavior of this function + is a no-op. + :return: + """ + return cls._enable_fancontrol_service(True) + + @classmethod + def _enable_fancontrol_service(cls, enable): + """ + Control thermal by fcs algorithm + Args: + enable: Bool, indicate enable the algorithm or not + Returns: + bool: True if set success, False if fail. + """ + cmd = 'start' if enable else 'stop' + return APIHelper().run_command(cls.FSC_ALGORITHM_CMD.format(cmd)) diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/watchdog.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/watchdog.py index b539bc06f61..d56cd520e8b 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/watchdog.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/watchdog.py @@ -7,115 +7,79 @@ # ############################################################################# import ctypes -import fcntl import os import subprocess import time -import array try: from sonic_platform_base.watchdog_base import WatchdogBase + from helper import APIHelper except ImportError as e: raise ImportError(str(e) + "- required module not found") -""" ioctl constants """ -IO_WRITE = 0x40000000 -IO_READ = 0x80000000 -IO_READ_WRITE = 0xC0000000 -IO_SIZE_INT = 0x00040000 -IO_SIZE_40 = 0x00280000 -IO_TYPE_WATCHDOG = ord('W') << 8 - -WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG -WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG -WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG - -""" Watchdog ioctl commands """ -WDIOC_GETSUPPORT = 0 | WDR_40 -WDIOC_GETSTATUS = 1 | WDR_INT -WDIOC_GETBOOTSTATUS = 2 | WDR_INT -WDIOC_GETTEMP = 3 | WDR_INT -WDIOC_SETOPTIONS = 4 | WDR_INT -WDIOC_KEEPALIVE = 5 | WDR_INT -WDIOC_SETTIMEOUT = 6 | WDWR_INT -WDIOC_GETTIMEOUT = 7 | WDR_INT -WDIOC_SETPRETIMEOUT = 8 | WDWR_INT -WDIOC_GETPRETIMEOUT = 9 | WDR_INT -WDIOC_GETTIMELEFT = 10 | WDR_INT - -""" Watchdog status constants """ -WDIOS_DISABLECARD = 0x0001 -WDIOS_ENABLECARD = 0x0002 - +PLATFORM_CPLD_PATH = '/sys/devices/platform/dx010_cpld' +GETREG_FILE = 'getreg' +SETREG_FILE = 'setreg' +WDT_ENABLE_REG = '0x141' +WDT_TIMER_L_BIT_REG = '0x142' +WDT_TIMER_M_BIT_REG = '0x143' +WDT_TIMER_H_BIT_REG = '0x144' +WDT_KEEP_ALVIVE_REG = '0x145' +ENABLE_CMD = '0x1' +DISABLE_CMD = '0x0' WDT_COMMON_ERROR = -1 -WD_MAIN_IDENTITY = "iTCO_wdt" -WDT_SYSFS_PATH = "/sys/class/watchdog/" class Watchdog(WatchdogBase): def __init__(self): + # Init helper + self._api_helper = APIHelper() + + # Init cpld reg path + self.setreg_path = os.path.join(PLATFORM_CPLD_PATH, SETREG_FILE) + self.getreg_path = os.path.join(PLATFORM_CPLD_PATH, GETREG_FILE) - self.watchdog, self.wdt_main_dev_name = self._get_wdt() - self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name - self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name - self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name # Set default value self._disable() self.armed = False - self.timeout = self._gettimeout(self.timeout_path) - - def _is_wd_main(self, dev): - """ - Checks watchdog identity - """ - identity = self._read_file( - "{}/{}/identity".format(WDT_SYSFS_PATH, dev)) - return identity == WD_MAIN_IDENTITY - - def _get_wdt(self): - """ - Retrieves watchdog device - """ - wdt_main_dev_list = [dev for dev in os.listdir( - "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] - if not wdt_main_dev_list: - return None - wdt_main_dev_name = wdt_main_dev_list[0] - watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) - watchdog = os.open(watchdog_device_path, os.O_RDWR) - return watchdog, wdt_main_dev_name - - def _read_file(self, file_path): - """ - Read text file - """ - try: - with open(file_path, "r") as fd: - txt = fd.read() - except IOError: - return WDT_COMMON_ERROR - return txt.strip() + self.timeout = self._gettimeout() def _enable(self): """ Turn on the watchdog timer """ - req = array.array('h', [WDIOS_ENABLECARD]) - fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + # echo 0x141 0x1 > /sys/devices/platform/dx010_cpld/setreg + enable_val = '{} {}'.format(WDT_ENABLE_REG, ENABLE_CMD) + return self._api_helper.write_txt_file(self.setreg_path, enable_val) def _disable(self): """ Turn off the watchdog timer """ - req = array.array('h', [WDIOS_DISABLECARD]) - fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + # echo 0x141 0x0 > /sys/devices/platform/dx010_cpld/setreg + disable_val = '{} {}'.format(WDT_ENABLE_REG, DISABLE_CMD) + return self._api_helper.write_txt_file(self.setreg_path, disable_val) def _keepalive(self): """ Keep alive watchdog timer """ - fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) + # echo 0x145 0x1 > /sys/devices/platform/dx010_cpld/setreg + enable_val = '{} {}'.format(WDT_KEEP_ALVIVE_REG, ENABLE_CMD) + return self._api_helper.write_txt_file(self.setreg_path, enable_val) + + def _get_level_hex(self, sub_hex): + sub_hex_str = sub_hex.replace("x", "0") + return hex(int(sub_hex_str, 16)) + + def _seconds_to_lmh_hex(self, seconds): + ms = seconds*1000 # calculate timeout in ms format + hex_str = hex(ms) + l = self._get_level_hex(hex_str[-2:]) + m = self._get_level_hex(hex_str[-4:-2]) + h = self._get_level_hex(hex_str[-6:-4]) + return (l, m, h) def _settimeout(self, seconds): """ @@ -123,29 +87,35 @@ def _settimeout(self, seconds): @param seconds - timeout in seconds @return is the actual set timeout """ - req = array.array('I', [seconds]) - fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) - return int(req[0]) + # max = 0xffffff = 16777.215 seconds + + (l, m, h) = self._seconds_to_lmh_hex(seconds) + set_h_val = '{} {}'.format(WDT_TIMER_H_BIT_REG, h) + set_m_val = '{} {}'.format(WDT_TIMER_M_BIT_REG, m) + set_l_val = '{} {}'.format(WDT_TIMER_L_BIT_REG, l) + + self._api_helper.write_txt_file(self.setreg_path, set_h_val) + self._api_helper.write_txt_file(self.setreg_path, set_m_val) + self._api_helper.write_txt_file(self.setreg_path, set_l_val) - def _gettimeout(self, timeout_path): + return seconds + + def _gettimeout(self): """ Get watchdog timeout @return watchdog timeout """ - req = array.array('I', [0]) - fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) - - return int(req[0]) - def _gettimeleft(self): - """ - Get time left before watchdog timer expires - @return time left in seconds - """ - req = array.array('I', [0]) - fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) + h_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_H_BIT_REG) + m_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_M_BIT_REG) + l_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_L_BIT_REG) - return int(req[0]) + hex_time = '0x{}{}{}'.format(h_bit[2:], m_bit[2:], l_bit[2:]) + ms = int(hex_time, 16) + return int(float(ms)/1000) ################################################################# @@ -165,16 +135,21 @@ def arm(self, seconds): ret = WDT_COMMON_ERROR if seconds < 0: return ret + if seconds > 16778: + return ret try: if self.timeout != seconds: self.timeout = self._settimeout(seconds) + if self.armed: self._keepalive() else: self._enable() self.armed = True + ret = self.timeout + self.arm_timestamp = time.time() except IOError as e: pass @@ -215,19 +190,4 @@ def get_remaining_time(self): watchdog timer. If the watchdog is not armed, returns -1. """ - timeleft = WDT_COMMON_ERROR - - if self.armed: - try: - timeleft = self._gettimeleft() - except IOError: - pass - - return timeleft - - def __del__(self): - """ - Close watchdog - """ - - os.close(self.watchdog) + return int(self.timeout - (time.time() - self.arm_timestamp)) if self.armed else WDT_COMMON_ERROR diff --git a/device/celestica/x86_64-cel_seastone-r0/system_health_monitoring_config.json b/device/celestica/x86_64-cel_seastone-r0/system_health_monitoring_config.json new file mode 100644 index 00000000000..4dc38d035ab --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/system_health_monitoring_config.json @@ -0,0 +1,16 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": [ + "asic", + "psu.temperature", + "PSU2 Fan", + "PSU1 Fan" + ], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "orange", + "normal": "green", + "booting": "orange_blink" + } +} \ No newline at end of file diff --git a/device/celestica/x86_64-cel_seastone-r0/thermal_overload_control.sh b/device/celestica/x86_64-cel_seastone-r0/thermal_overload_control.sh new file mode 100755 index 00000000000..57fd851f9cf --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/thermal_overload_control.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# Copyright 2020-present Celestica. All Rights Reserved. +# +# This program file 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; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# + +PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin +SETREG_FILE=/sys/devices/platform/dx010_cpld/setreg +TOVERREG=0x140 +CPUOVER=0xa1 +ASICOVER=0xa2 + +prog="$0" +command="$1" + +if [[ $EUID -ne 0 ]]; then + echo "This script must be run as root" + exit 1 +fi + +usage() { + echo "Usage: thermal_overload_control.sh [option] " + echo + echo "Options:" + echo " -h, --help : to print this message." + echo + echo "Commands:" + echo + echo " cpu: To enabling CPU thermal overload handler" + echo + echo " asic : To enabling ASIC thermal overload handler" + echo +} + +cpu_overload() { + logger "Enable CPU thermal overload control" + set_reg=`echo ${TOVERREG} ${CPUOVER} > ${SETREG_FILE}` +} + +asic_overload() { + logger "Enable ASIC thermal overload control" + set_reg=`echo ${TOVERREG} ${ASICOVER} > ${SETREG_FILE}` +} + +if [ $# -lt 1 ]; then + usage + exit -1 +fi + +case "$command" in +-h | --help) + usage + ;; +cpu) + cpu_overload + ;; +asic) + asic_overload + ;; +*) + usage + exit -1 + ;; +esac + +exit $? diff --git a/device/celestica/x86_64-cel_seastone-r0/thermal_policy.json b/device/celestica/x86_64-cel_seastone-r0/thermal_policy.json new file mode 100644 index 00000000000..f937b6bd445 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/thermal_policy.json @@ -0,0 +1,93 @@ +{ + "thermal_control_algorithm": { + "run_at_boot_up": "true" + }, + "info_types": [ + { + "type": "chassis_info" + }, + { + "type": "fan_info" + }, + { + "type": "thermal_info" + } + ], + "policies": [ + { + "name": "any fan absence", + "conditions": [ + { + "type": "fan.any.absence" + } + ], + "actions": [ + { + "type": "thermal_control.control", + "status": "false" + } + ] + }, + { + "name": "any fan broken", + "conditions": [ + { + "type": "fan.any.fault" + } + ], + "actions": [ + { + "type": "thermal_control.control", + "status": "false" + } + ] + }, + { + "name": "any thermal over threshold", + "conditions": [ + { + "type": "thermal.over.high_threshold" + } + ], + "actions": [ + { + "type": "thermal_control.control", + "status": "false" + } + ] + }, + { + "name": "temp over high critical threshold", + "conditions": [ + { + "type": "thermal.over.high_critical_threshold" + } + ], + "actions": [ + { + "type": "switch.power_cycling" + } + ] + }, + { + "name": "all fan presence / thermal no warning", + "conditions": [ + { + "type": "fan.all.presence" + }, + { + "type": "fan.all.good" + }, + { + "type": "thermal.all.good" + } + ], + "actions": [ + { + "type": "thermal_control.control", + "status": "true" + } + ] + } + ] +} \ No newline at end of file diff --git a/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/sai.profile b/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/sai.profile index bc7681f0272..483e85c0c1f 100644 --- a/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/sai.profile +++ b/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th3-128x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/celestica/x86_64-cel_silverstone-r0/Silverstone/sai.profile b/device/celestica/x86_64-cel_silverstone-r0/Silverstone/sai.profile index 1915eb9b35a..550bfe181df 100644 --- a/device/celestica/x86_64-cel_silverstone-r0/Silverstone/sai.profile +++ b/device/celestica/x86_64-cel_silverstone-r0/Silverstone/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th3-32x400G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers.json.j2 b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers.json.j2 new file mode 100755 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers_defaults_def_lossy.j2 new file mode 100755 index 00000000000..1a31812c26b --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers_defaults_t1.j2 b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers_defaults_t1.j2 new file mode 100755 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/config_32x400G_silverstone-x.yaml b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/config_32x400G_silverstone-x.yaml new file mode 100755 index 00000000000..e2f9332a9b7 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/config_32x400G_silverstone-x.yaml @@ -0,0 +1,419 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + isg: + - id: "32" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00000000" + - id: "0" + lane_swap: "01234567" + tx_polarity: "00000000" + rx_polarity: "10000000" + - id: "1" + lane_swap: "71645320" + tx_polarity: "01010111" + rx_polarity: "10100100" + - id: "2" + lane_swap: "01234567" + tx_polarity: "01000010" + rx_polarity: "10000100" + - id: "3" + lane_swap: "01234567" + tx_polarity: "11000110" + rx_polarity: "10001011" + - id: "4" + lane_swap: "07264513" + tx_polarity: "00011001" + rx_polarity: "11111000" + - id: "5" + lane_swap: "34175620" + tx_polarity: "00001000" + rx_polarity: "10110000" + - id: "6" + lane_swap: "07214563" + tx_polarity: "00010001" + rx_polarity: "00110010" + - id: "7" + lane_swap: "74653120" + tx_polarity: "00001000" + rx_polarity: "00110001" + - id: "8" + lane_swap: "07264513" + tx_polarity: "01000011" + rx_polarity: "01110001" + - id: "9" + lane_swap: "75634120" + tx_polarity: "00001100" + rx_polarity: "00101001" + - id: "10" + lane_swap: "07264513" + tx_polarity: "00010001" + rx_polarity: "01100000" + - id: "11" + lane_swap: "71634520" + tx_polarity: "01001010" + rx_polarity: "10101001" + - id: "12" + lane_swap: "01236547" + tx_polarity: "00000001" + rx_polarity: "10000010" + - id: "13" + lane_swap: "21374560" + tx_polarity: "00010011" + rx_polarity: "10001000" + - id: "14" + lane_swap: "05214763" + tx_polarity: "00000000" + rx_polarity: "00000000" + - id: "15" + lane_swap: "61234570" + tx_polarity: "11000000" + rx_polarity: "00110010" + - id: "16" + lane_swap: "01234765" + tx_polarity: "00000000" + rx_polarity: "00000000" + - id: "17" + lane_swap: "61234570" + tx_polarity: "00001010" + rx_polarity: "10000111" + - id: "18" + lane_swap: "01234567" + tx_polarity: "00000000" + rx_polarity: "00000100" + - id: "19" + lane_swap: "01234567" + tx_polarity: "10001000" + rx_polarity: "11101011" + - id: "20" + lane_swap: "01234567" + tx_polarity: "01000010" + rx_polarity: "00100000" + - id: "21" + lane_swap: "05243176" + tx_polarity: "00100110" + rx_polarity: "00000011" + - id: "22" + lane_swap: "06214735" + tx_polarity: "01000100" + rx_polarity: "00110000" + - id: "23" + lane_swap: "01234567" + tx_polarity: "01011010" + rx_polarity: "10101010" + - id: "24" + lane_swap: "01234567" + tx_polarity: "01001111" + rx_polarity: "01100001" + - id: "25" + lane_swap: "03251467" + tx_polarity: "00000000" + rx_polarity: "10110010" + - id: "26" + lane_swap: "01234567" + tx_polarity: "01000001" + rx_polarity: "00100010" + - id: "27" + lane_swap: "04251367" + tx_polarity: "01101001" + rx_polarity: "11100001" + - id: "28" + lane_swap: "01234567" + tx_polarity: "10100100" + rx_polarity: "01010110" + - id: "29" + lane_swap: "01254367" + tx_polarity: "00010011" + rx_polarity: "10111001" + - id: "30" + lane_swap: "01234567" + tx_polarity: "00000000" + rx_polarity: "01000101" + - id: "31" + lane_swap: "01234567" + tx_polarity: "00000110" + rx_polarity: "11100011" + diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/innovium.77700_A b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/innovium.77700_A new file mode 100755 index 00000000000..84aa4198360 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/innovium.77700_B b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/innovium.77700_B new file mode 100755 index 00000000000..27297b31395 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/ivm.sai.config.yaml b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/ivm.sai.config.yaml new file mode 100755 index 00000000000..f35065d382b --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_silverstone-x.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/ivm.sai.datapath.config.yaml b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/ivm.sai.datapath.config.yaml new file mode 100755 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/pg_profile_lookup.ini b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/pg_profile_lookup.ini new file mode 100755 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/port_config.ini b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/port_config.ini new file mode 100644 index 00000000000..af66871eec8 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 217,218,219,220,221,222,223,224 Eth1 400000 0 9126 rs +Ethernet8 209,210,211,212,213,214,215,216 Eth2 400000 1 9126 rs +Ethernet16 201,202,203,204,205,206,207,208 Eth3 400000 2 9126 rs +Ethernet24 193,194,195,196,197,198,199,200 Eth4 400000 3 9126 rs +Ethernet32 185,186,187,188,189,190,191,192 Eth5 400000 4 9126 rs +Ethernet40 177,178,179,180,181,182,183,184 Eth6 400000 5 9126 rs +Ethernet48 169,170,171,172,173,174,175,176 Eth7 400000 6 9126 rs +Ethernet56 161,162,163,164,165,166,167,168 Eth8 400000 7 9126 rs +Ethernet64 249,250,251,252,253,254,255,256 Eth9 400000 8 9126 rs +Ethernet72 241,242,243,244,245,246,247,248 Eth10 400000 9 9126 rs +Ethernet80 233,234,235,236,237,238,239,240 Eth11 400000 10 9126 rs +Ethernet88 225,226,227,228,229,230,231,232 Eth12 400000 11 9126 rs +Ethernet96 153,154,155,156,157,158,159,160 Eth13 400000 12 9126 rs +Ethernet104 145,146,147,148,149,150,151,152 Eth14 400000 13 9126 rs +Ethernet112 137,138,139,140,141,142,143,144 Eth15 400000 14 9126 rs +Ethernet120 129,130,131,132,133,134,135,136 Eth16 400000 15 9126 rs +Ethernet128 121,122,123,124,125,126,127,128 Eth17 400000 16 9126 rs +Ethernet136 113,114,115,116,117,118,119,120 Eth18 400000 17 9126 rs +Ethernet144 105,106,107,108,109,110,111,112 Eth19 400000 18 9126 rs +Ethernet152 97,98,99,100,101,102,103,104 Eth20 400000 19 9126 rs +Ethernet160 25,26,27,28,29,30,31,32 Eth21 400000 20 9126 rs +Ethernet168 17,18,19,20,21,22,23,24 Eth22 400000 21 9126 rs +Ethernet176 9,10,11,12,13,14,15,16 Eth23 400000 22 9126 rs +Ethernet184 1,2,3,4,5,6,7,8 Eth24 400000 23 9126 rs +Ethernet192 89,90,91,92,93,94,95,96 Eth25 400000 24 9126 rs +Ethernet200 81,82,83,84,85,86,87,88 Eth26 400000 25 9126 rs +Ethernet208 73,74,75,76,77,78,79,80 Eth27 400000 26 9126 rs +Ethernet216 65,66,67,68,69,70,71,72 Eth28 400000 27 9126 rs +Ethernet224 57,58,59,60,61,62,63,64 Eth29 400000 28 9126 rs +Ethernet232 49,50,51,52,53,54,55,56 Eth30 400000 29 9126 rs +Ethernet240 41,42,43,44,45,46,47,48 Eth31 400000 30 9126 rs +Ethernet248 33,34,35,36,37,38,39,40 Eth32 400000 31 9126 rs diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos.json.j2 b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos.json.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos_defaults_def_lossy.j2 b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos_defaults_t1.j2 b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/sai.profile b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/Silverstone-x/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/default_sku b/device/celestica/x86_64-cel_silverstone-x-r0/default_sku new file mode 100644 index 00000000000..49b09d3fade --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/default_sku @@ -0,0 +1 @@ +Silverstone-x t1 diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/installer.conf b/device/celestica/x86_64-cel_silverstone-x-r0/installer.conf new file mode 100644 index 00000000000..5e62742c11b --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/installer.conf @@ -0,0 +1 @@ +CONSOLE_SPEED=115200 diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/platform1.json b/device/celestica/x86_64-cel_silverstone-x-r0/platform1.json new file mode 100644 index 00000000000..9eec0a9028d --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/platform1.json @@ -0,0 +1,927 @@ +{ + "chassis": { + "name": "Silverstone-x", + "status_led": { + "controllable": false, + "colors": ["green", "amber", "off"] + }, + "components": [ + { + "name": "FPGA" + }, + { + "name": "COME_CPLD" + }, + { + "name": "SWCPLD1" + }, + { + "name": "SWCPLD2" + }, + { + "name": "FANCPLD" + }, + { + "name": "SYSCPLD" + }, + { + "name": "Main_BMC" + }, + { + "name": "Backup_BMC" + }, + { + "name": "Main_BIOS" + }, + { + "name": "Backup_BIOS" + } + ], + "fans": [ + { + "name": "FAN-1F" + }, + { + "name": "FAN-1R" + }, + { + "name": "FAN-2F" + }, + { + "name": "FAN-2R" + }, + { + "name": "FAN-3F" + }, + { + "name": "FAN-3R" + }, + { + "name": "FAN-4F" + }, + { + "name": "FAN-4R" + }, + { + "name": "FAN-5F" + }, + { + "name": "FAN-5R" + }, + { + "name": "FAN-6F" + }, + { + "name": "FAN-6R" + }, + { + "name": "FAN-7F" + }, + { + "name": "FAN-7R" + } + ], + "fan_drawers": [ + { + "name": "Drawer1", + "fans": [ + { + "name": "FAN-1F" + }, + { + "name": "FAN-1R" + } + ] + }, + { + "name": "Drawer2", + "fans": [ + { + "name": "FAN-2F" + }, + { + "name": "FAN-2R" + } + ] + }, + { + "name": "Drawer3", + "fans": [ + { + "name": "FAN-3F" + }, + { + "name": "FAN-3R" + } + ] + }, + { + "name": "Drawer4", + "fans": [ + { + "name": "FAN-4F" + }, + { + "name": "FAN-4R" + } + ] + }, + { + "name": "Drawer5", + "fans": [ + { + "name": "FAN-5F" + }, + { + "name": "FAN-5R" + } + ] + } + ], + "psus": [ + { + "name": "PSU-1", + "fans": [ + { + "name": "PSU-1 FAN-1" + } + ] + }, + { + "name": "PSU-2", + "fans": [ + { + "name": "PSU-2 FAN-1" + } + ] + } + ], + "thermals": [ + { + "name": "TEMP_FB_U52" + }, + { + "name": "TEMP_FB_U17" + }, + { + "name": "TEMP_SW_U2" + }, + { + "name": "TEMP_CPU" + }, + { + "name": "TEMP_DIMM0" + }, + { + "name": "TEMP_DIMM1" + }, + { + "name": "TEMP_SW_Internal" + }, + { + "name": "PSU1_Temp1" + }, + { + "name": "PSU1_Temp2" + }, + { + "name": "PSU1_Temp3" + }, + { + "name": "PSU2_Temp1" + }, + { + "name": "PSU2_Temp2" + }, + { + "name": "PSU2_Temp3" + }, + { + "name": "TEMP_SW_U52" + }, + { + "name": "TEMP_SW_U16" + }, + { + "name": "I89_CORE_Temp" + }, + { + "name": "I89_AVDD_Temp" + }, + { + "name": "QSFP_DD_Temp1" + }, + { + "name": "QSFP_DD_Temp2" + } + ], + "sfps": [ + { + "name": "Ethernet0" + }, + { + "name": "Ethernet8" + }, + { + "name": "Ethernet16" + }, + { + "name": "Ethernet24" + }, + { + "name": "Ethernet32" + }, + { + "name": "Ethernet40" + }, + { + "name": "Ethernet48" + }, + { + "name": "Ethernet56" + }, + { + "name": "Ethernet64" + }, + { + "name": "Ethernet72" + }, + { + "name": "Ethernet80" + }, + { + "name": "Ethernet88" + }, + { + "name": "Ethernet96" + }, + { + "name": "Ethernet104" + }, + { + "name": "Ethernet112" + }, + { + "name": "Ethernet120" + }, + { + "name": "Ethernet128" + }, + { + "name": "Ethernet136" + }, + { + "name": "Ethernet144" + }, + { + "name": "Ethernet152" + }, + { + "name": "Ethernet160" + }, + { + "name": "Ethernet168" + }, + { + "name": "Ethernet176" + }, + { + "name": "Ethernet184" + }, + { + "name": "Ethernet192" + }, + { + "name": "Ethernet200" + }, + { + "name": "Ethernet208" + }, + { + "name": "Ethernet216" + }, + { + "name": "Ethernet224" + }, + { + "name": "Ethernet232" + }, + { + "name": "Ethernet240" + }, + { + "name": "Ethernet248" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0,0,0,0", + "lanes": "65,66,67,68", + "breakout_modes": { + "1x100G[40G]": [ + "Eth1" + ], + "2x50G": [ + "Eth1/1", + "Eth1/2" + ], + "4x25G[10G]": [ + "Eth1/1", + "Eth1/2", + "Eth1/3", + "Eth1/4" + ] + } + }, + "Ethernet8": { + "index": "1,1,1,1", + "lanes": "65,66,67,68", + "breakout_modes": { + "1x100G[40G]": [ + "Eth1" + ], + "2x50G": [ + "Eth1/1", + "Eth1/2" + ], + "4x25G[10G]": [ + "Eth1/1", + "Eth1/2", + "Eth1/3", + "Eth1/4" + ] + } + }, + "Ethernet16": { + "index": "2,2,2,2", + "lanes": "69,70,71,72", + "breakout_modes": { + "1x100G[40G]": [ + "Eth2" + ], + "2x50G": [ + "Eth2/1", + "Eth2/2" + ], + "4x25G[10G]": [ + "Eth2/1", + "Eth2/2", + "Eth2/3", + "Eth2/4" + ] + } + }, + "Ethernet24": { + "index": "3,3,3,3", + "lanes": "73,74,75,76", + "breakout_modes": { + "1x100G[40G]": [ + "Eth3" + ], + "2x50G": [ + "Eth3/1", + "Eth3/2" + ], + "4x25G[10G]": [ + "Eth3/1", + "Eth3/2", + "Eth3/3", + "Eth3/4" + ] + } + }, + "Ethernet32": { + "index": "4,4,4,4", + "lanes": "77,78,79,80", + "breakout_modes": { + "1x100G[40G]": [ + "Eth4" + ], + "2x50G": [ + "Eth4/1", + "Eth4/2" + ], + "4x25G[10G]": [ + "Eth4/1", + "Eth4/2", + "Eth4/3", + "Eth4/4" + ] + } + }, + "Ethernet40": { + "index": "5,5,5,5", + "lanes": "33,34,35,36", + "breakout_modes": { + "1x100G[40G]": [ + "Eth5" + ], + "2x50G": [ + "Eth5/1", + "Eth5/2" + ], + "4x25G[10G]": [ + "Eth5/1", + "Eth5/2", + "Eth5/3", + "Eth5/4" + ] + } + }, + "Ethernet48": { + "index": "6,6,6,6", + "lanes": "37,38,39,40", + "breakout_modes": { + "1x100G[40G]": [ + "Eth6" + ], + "2x50G": [ + "Eth6/1", + "Eth6/2" + ], + "4x25G[10G]": [ + "Eth6/1", + "Eth6/2", + "Eth6/3", + "Eth6/4" + ] + } + }, + "Ethernet56": { + "index": "7,7,7,7", + "lanes": "41,42,43,44", + "breakout_modes": { + "1x100G[40G]": [ + "Eth7" + ], + "2x50G": [ + "Eth7/1", + "Eth7/2" + ], + "4x25G[10G]": [ + "Eth7/1", + "Eth7/2", + "Eth7/3", + "Eth7/4" + ] + } + }, + "Ethernet64": { + "index": "8,8,8,8", + "lanes": "45,46,47,48", + "breakout_modes": { + "1x100G[40G]": [ + "Eth8" + ], + "2x50G": [ + "Eth8/1", + "Eth8/2" + ], + "4x25G[10G]": [ + "Eth8/1", + "Eth8/2", + "Eth8/3", + "Eth8/4" + ] + } + }, + "Ethernet72": { + "index": "9,9,9,9", + "lanes": "49,50,51,52", + "breakout_modes": { + "1x100G[40G]": [ + "Eth9" + ], + "2x50G": [ + "Eth9/1", + "Eth9/2" + ], + "4x25G[10G]": [ + "Eth9/1", + "Eth9/2", + "Eth9/3", + "Eth9/4" + ] + } + }, + "Ethernet80": { + "index": "10,10,10,10", + "lanes": "53,54,55,56", + "breakout_modes": { + "1x100G[40G]": [ + "Eth10" + ], + "2x50G": [ + "Eth10/1", + "Eth10/2" + ], + "4x25G[10G]": [ + "Eth10/1", + "Eth10/2", + "Eth10/3", + "Eth10/4" + ] + } + }, + "Ethernet88": { + "index": "11,11,11,11", + "lanes": "57,58,59,60", + "breakout_modes": { + "1x100G[40G]": [ + "Eth11" + ], + "2x50G": [ + "Eth11/1", + "Eth11/2" + ], + "4x25G[10G]": [ + "Eth11/1", + "Eth11/2", + "Eth11/3", + "Eth11/4" + ] + } + }, + "Ethernet96": { + "index": "12,12,12,12", + "lanes": "61,62,63,64", + "breakout_modes": { + "1x100G[40G]": [ + "Eth12" + ], + "2x50G": [ + "Eth12/1", + "Eth12/2" + ], + "4x25G[10G]": [ + "Eth12/1", + "Eth12/2", + "Eth12/3", + "Eth12/4" + ] + } + }, + "Ethernet104": { + "index": "13,13,13,13", + "lanes": "81,82,83,84", + "breakout_modes": { + "1x100G[40G]": [ + "Eth13" + ], + "2x50G": [ + "Eth13/1", + "Eth13/2" + ], + "4x25G[10G]": [ + "Eth13/1", + "Eth13/2", + "Eth13/3", + "Eth13/4" + ] + } + }, + "Ethernet112": { + "index": "14,14,14,14", + "lanes": "85,86,87,88", + "breakout_modes": { + "1x100G[40G]": [ + "Eth14" + ], + "2x50G": [ + "Eth14/1", + "Eth14/2" + ], + "4x25G[10G]": [ + "Eth14/1", + "Eth14/2", + "Eth14/3", + "Eth14/4" + ] + } + }, + "Ethernet120": { + "index": "15,15,15,15", + "lanes": "89,90,91,92", + "breakout_modes": { + "1x100G[40G]": [ + "Eth15" + ], + "2x50G": [ + "Eth15/1", + "Eth15/2" + ], + "4x25G[10G]": [ + "Eth15/1", + "Eth15/2", + "Eth15/3", + "Eth15/4" + ] + } + }, + "Ethernet128": { + "index": "16,16,16,16", + "lanes": "93,94,95,96", + "breakout_modes": { + "1x100G[40G]": [ + "Eth16" + ], + "2x50G": [ + "Eth16/1", + "Eth16/2" + ], + "4x25G[10G]": [ + "Eth16/1", + "Eth16/2", + "Eth16/3", + "Eth16/4" + ] + } + }, + "Ethernet136": { + "index": "17,17,17,17", + "lanes": "97,98,99,100", + "breakout_modes": { + "1x100G[40G]": [ + "Eth17" + ], + "2x50G": [ + "Eth17/1", + "Eth17/2" + ], + "4x25G[10G]": [ + "Eth17/1", + "Eth17/2", + "Eth17/3", + "Eth17/4" + ] + } + }, + "Ethernet144": { + "index": "18,18,18,18", + "lanes": "101,102,103,104", + "breakout_modes": { + "1x100G[40G]": [ + "Eth18" + ], + "2x50G": [ + "Eth18/1", + "Eth18/2" + ], + "4x25G[10G]": [ + "Eth18/1", + "Eth18/2", + "Eth18/3", + "Eth18/4" + ] + } + }, + "Ethernet152": { + "index": "19,19,19,19", + "lanes": "105,106,107,108", + "breakout_modes": { + "1x100G[40G]": [ + "Eth19" + ], + "2x50G": [ + "Eth19/1", + "Eth19/2" + ], + "4x25G[10G]": [ + "Eth19/1", + "Eth19/2", + "Eth19/3", + "Eth19/4" + ] + } + }, + "Ethernet160": { + "index": "20,20,20,20", + "lanes": "109,110,111,112", + "breakout_modes": { + "1x100G[40G]": [ + "Eth20" + ], + "2x50G": [ + "Eth20/1", + "Eth20/2" + ], + "4x25G[10G]": [ + "Eth20/1", + "Eth20/2", + "Eth20/3", + "Eth20/4" + ] + } + }, + "Ethernet168": { + "index": "21,21,21,21", + "lanes": "1,2,3,4", + "breakout_modes": { + "1x100G[40G]": [ + "Eth21" + ], + "2x50G": [ + "Eth21/1", + "Eth21/2" + ], + "4x25G[10G]": [ + "Eth21/1", + "Eth21/2", + "Eth21/3", + "Eth21/4" + ] + } + }, + "Ethernet176": { + "index": "22,22,22,22", + "lanes": "5,6,7,8", + "breakout_modes": { + "1x100G[40G]": [ + "Eth22" + ], + "2x50G": [ + "Eth22/1", + "Eth22/2" + ], + "4x25G[10G]": [ + "Eth22/1", + "Eth22/2", + "Eth22/3", + "Eth22/4" + ] + } + }, + "Ethernet184": { + "index": "23,23,23,23", + "lanes": "9,10,11,12", + "breakout_modes": { + "1x100G[40G]": [ + "Eth23" + ], + "2x50G": [ + "Eth23/1", + "Eth23/2" + ], + "4x25G[10G]": [ + "Eth23/1", + "Eth23/2", + "Eth23/3", + "Eth23/4" + ] + } + }, + "Ethernet192": { + "index": "24,24,24,24", + "lanes": "13,14,15,16", + "breakout_modes": { + "1x100G[40G]": [ + "Eth24" + ], + "2x50G": [ + "Eth24/1", + "Eth24/2" + ], + "4x25G[10G]": [ + "Eth24/1", + "Eth24/2", + "Eth24/3", + "Eth24/4" + ] + } + }, + "Ethernet200": { + "index": "25,25,25,25", + "lanes": "17,18,19,20", + "breakout_modes": { + "1x100G[40G]": [ + "Eth25" + ], + "2x50G": [ + "Eth25/1", + "Eth25/2" + ], + "4x25G[10G]": [ + "Eth25/1", + "Eth25/2", + "Eth25/3", + "Eth25/4" + ] + } + }, + "Ethernet208": { + "index": "26,26,26,26", + "lanes": "21,22,23,24", + "breakout_modes": { + "1x100G[40G]": [ + "Eth26" + ], + "2x50G": [ + "Eth26/1", + "Eth26/2" + ], + "4x25G[10G]": [ + "Eth26/1", + "Eth26/2", + "Eth26/3", + "Eth26/4" + ] + } + }, + "Ethernet216": { + "index": "27,27,27,27", + "lanes": "25,26,27,28", + "breakout_modes": { + "1x100G[40G]": [ + "Eth27" + ], + "2x50G": [ + "Eth27/1", + "Eth27/2" + ], + "4x25G[10G]": [ + "Eth27/1", + "Eth27/2", + "Eth27/3", + "Eth27/4" + ] + } + }, + "Ethernet224": { + "index": "28,28,28,28", + "lanes": "29,30,31,32", + "breakout_modes": { + "1x100G[40G]": [ + "Eth28" + ], + "2x50G": [ + "Eth28/1", + "Eth28/2" + ], + "4x25G[10G]": [ + "Eth28/1", + "Eth28/2", + "Eth28/3", + "Eth28/4" + ] + } + }, + "Ethernet232": { + "index": "29,29,29,29", + "lanes": "113,114,115,116", + "breakout_modes": { + "1x100G[40G]": [ + "Eth29" + ], + "2x50G": [ + "Eth29/1", + "Eth29/2" + ], + "4x25G[10G]": [ + "Eth29/1", + "Eth29/2", + "Eth29/3", + "Eth29/4" + ] + } + }, + "Ethernet240": { + "index": "30,30,30,30", + "lanes": "117,118,119,120", + "breakout_modes": { + "1x100G[40G]": [ + "Eth30" + ], + "2x50G": [ + "Eth30/1", + "Eth30/2" + ], + "4x25G[10G]": [ + "Eth30/1", + "Eth30/2", + "Eth30/3", + "Eth30/4" + ] + } + }, + "Ethernet248": { + "index": "31,31,31,31", + "lanes": "121,122,123,124", + "breakout_modes": { + "1x100G[40G]": [ + "Eth31" + ], + "2x50G": [ + "Eth31/1", + "Eth31/2" + ], + "4x25G[10G]": [ + "Eth31/1", + "Eth31/2", + "Eth31/3", + "Eth31/4" + ] + } + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/platform_components.json b/device/celestica/x86_64-cel_silverstone-x-r0/platform_components.json new file mode 100644 index 00000000000..587e034c43e --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/platform_components.json @@ -0,0 +1,18 @@ +{ + "chassis": { + "Silverstone-x": { + "component": { + "Main_BMC": {}, + "Backup_BMC": {}, + "Main_BIOS": {}, + "Backup_BIOS": {}, + "COME_CPLD": {}, + "SWCPLD1": {}, + "SWCPLD2": {}, + "SYSCPLD": {}, + "FANCPLD": {}, + "FPGA": {} + } + } + } +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/plugins/alarm_led_control.py b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/alarm_led_control.py new file mode 100755 index 00000000000..8178ccdfcd3 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/alarm_led_control.py @@ -0,0 +1,372 @@ +#!/usr/bin/python + +try: + import time + from datetime import datetime + + from sonic_py_common import logger + from sonic_platform.thermal import Thermal + from sonic_platform.psu import Psu + from sonic_platform.fan import Fan + from sonic_platform.helper import APIHelper + from misc_sensors import MiscSensors +except ImportError as e: + raise ImportError(repr(e) + " - required module not found") + + +SYSLOG_IDENTIFIER = 'ledctld' +NOT_AVAILABLE = 'N/A' + +# Baseboard CPLD file +BASECPLD_SETREG_FILE = "/sys/devices/platform/sys_cpld/setreg" +# Alarm control register in baseboard CPLD +ALAEM_LED_CR_REG = "0xA163" +ALAEM_LED_1HZ = "1" +ALAEM_LED_4HZ = "2" +ALAEM_LED_GREEN = "0x10" +ALAEM_LED_AMBER = "0x20" + +# COMe power button control register in baseboard CPLD +COMe_PWRCR_REG = "0xA124" +# COMe power off value in baseboard CPLD +COMe_PWRCR_OFF = "0" + +NUM_THERMAL = 20 +NUM_PSU = 2 +NUM_MISC_SENSORS_PWR = 75 +PSU_NUM_FAN = 2 +NUM_FAN_TRAY = 7 +NUM_FAN_PER_TRAY = 2 + + +def try_get(callback, default=NOT_AVAILABLE): + """ + Handy function to invoke the callback and catch NotImplementedError + :param callback: Callback to be invoked + :param default: Default return value if exception occur + :return: Default return value if exception occur else return value of the callback + """ + try: + ret = callback() + if ret is None: + ret = default + except NotImplementedError: + ret = default + + return ret + + +def alarm_led_blink(hz): + _api_helper = APIHelper() + _api_helper.run_command("echo " + ALAEM_LED_CR_REG + " " + hz + " > " + BASECPLD_SETREG_FILE) + + +def __get_air_flow(): + _api_helper = APIHelper() + fan_air_flow = _api_helper.read_txt_file("/sys/bus/i2c/devices/i2c-9/9-000d/fan1_direction") + return 'B2F' if int(fan_air_flow) == 0 else "F2B" + + +class TemperatureUpdater(logger.Logger): + """ + TemperatureUpdater + """ + + def __init__(self, log_identifier, _thermal_list): + super(TemperatureUpdater, self).__init__(log_identifier) + self.logger = logger.Logger(SYSLOG_IDENTIFIER) + self._thermal_list = _thermal_list + + def update(self): + # normal warning; critical warning; non-recoverable warning + warning = [False, False, False] + self.log_debug("Start temperature updating") + for index, thermal in enumerate(self._thermal_list): + try: + warning = self._refresh_temperature_status(thermal, index) + if any(warning): + return warning + except Exception as E: + self.log_warning('Failed to update thermal status - {}'.format(repr(E))) + + self.log_debug("End temperature updating") + + return warning + + def _refresh_temperature_status(self, thermal, index): + _api_helper = APIHelper() + warning = [True, True, False] + name = try_get(thermal.get_name, 'Thermal {}'.format(index + 1)) + + temperature = try_get(thermal.get_temperature) + if temperature != NOT_AVAILABLE and temperature != 0: + high_threshold = try_get(thermal.get_high_threshold) + low_threshold = try_get(thermal.get_low_threshold) + high_critical_threshold = try_get(thermal.get_high_critical_threshold) + low_critical_threshold = try_get(thermal.get_low_critical_threshold) + else: + self.log_warning('Cant get temperature %s value\n' % name) + return warning + + if high_critical_threshold != NOT_AVAILABLE and temperature > int(high_critical_threshold): + if name == "TEMP_SW_Internal": + try: + # if TEMP_SW_Internal is higher than critical threshold, perform SW shutdown + warning = [True, True, True] + self.log_error('Temperature %s: %d higher than critical threshold %d\n' % ( + name, temperature, high_critical_threshold)) + self.log_error('SW shutdown due to temperature %s: %d higher than critical threshold %d\n' % ( + name, temperature, high_critical_threshold)) + # /var/log/syslog report has delays, to avoid missing log before SW shutdown, + # use below cmd to collect error again immediately + command = "echo \"{} ERROR Temperature {}: {} higher than critical threshold {}\"" \ + " >> /var/log/messages".format(datetime.now(), name, str(temperature), + str(high_critical_threshold)) + _api_helper.run_command(command) + command = "echo \"{} ERROR SW shutdown due to temperature {}: {} higher " \ + "than critical threshold {}\" >> /var/log/messages"\ + .format(datetime.now(), name, str(temperature), str(high_critical_threshold)) + _api_helper.run_command(command) + _api_helper.run_command( + "echo " + COMe_PWRCR_REG + " " + COMe_PWRCR_OFF + " > " + BASECPLD_SETREG_FILE) + + except Exception as E: + print("error cause:%s" % E) + else: + self.log_warning('Temperature %s: %d higher than critical threshold %d\n' % (name, temperature, + high_critical_threshold)) + warning = [True, True, False] + elif high_threshold != NOT_AVAILABLE and temperature > int(high_threshold): + if name == "TEMP_SW_Internal": + self.log_warning('Temperature %s: %d higher than threshold %d\n' % (name, temperature, high_threshold)) + warning = [True, True, False] + # /var/log/syslog report has delays, to avoid missing log before SW shutdown, + # use below cmd to collect error again immediately + command = "echo \"{} WARNING Temperature {}: {} higher than threshold {}\" >> /var/log/messages".format( + datetime.now(), name, str(temperature), str(high_threshold)) + _api_helper.run_command(command) + else: + self.log_notice('Temperature %s: %d higher than threshold %d\n' % (name, temperature, high_threshold)) + warning = [True, False, False] + elif low_critical_threshold != NOT_AVAILABLE and temperature < int(low_critical_threshold): + self.log_warning( + 'Temperature %s: %d lower than critical threshold %d\n' % (name, temperature, low_critical_threshold)) + warning = [False, True, False] + elif low_threshold != NOT_AVAILABLE and temperature < int(low_threshold): + self.log_notice('Temperature %s: %d lower than threshold %d\n' % (name, temperature, low_threshold)) + warning = [True, False, False] + else: + warning = [False, False, False] + + return warning + + +class MiscSensorsUpdater(logger.Logger): + """ + MiscSensorsUpdater + """ + + def __init__(self, log_identifier, _miscsensors_list): + super(MiscSensorsUpdater, self).__init__(log_identifier) + self.logger = logger.Logger(SYSLOG_IDENTIFIER) + self._miscsensors_list = _miscsensors_list + + def update(self): + # normal warning; critical warning; non-recoverable warning + warning = [False, False, False] + self.log_debug("Start miscellaneous updating") + for index, miscsensors in enumerate(self._miscsensors_list): + try: + warning = self._refresh_miscsensors_status(miscsensors, index) + if any(warning): + return warning + except Exception as E: + self.log_warning('Failed to update miscsensors status - {}'.format(repr(E))) + + self.log_debug("End miscsensors or power updating") + + return warning + + def _refresh_miscsensors_status(self, miscsensors, index): + warning = [True, True, False] + name = try_get(miscsensors.get_name, 'miscsensors {}'.format(index + 1)) + value = try_get(miscsensors.get_miscsensors_value) + if value != NOT_AVAILABLE and value != 0: + high_threshold = try_get(miscsensors.get_high_threshold) + low_threshold = try_get(miscsensors.get_low_threshold) + high_critical_threshold = try_get(miscsensors.get_high_critical_threshold) + low_critical_threshold = try_get(miscsensors.get_low_critical_threshold) + else: + self.log_warning('Cant get sensor %s value\n' % name) + return warning + + if high_critical_threshold != NOT_AVAILABLE and value > int(high_critical_threshold): + if name == "PSU1_VOut" or name == "PSU2_VOut": + self.log_error( + 'sensor %s: %d higher than critical threshold %d\n' % (name, value, high_critical_threshold)) + warning = [True, True, True] + else: + self.log_warning( + 'sensor %s: %d higher than critical threshold %d\n' % (name, value, high_critical_threshold)) + warning = [False, True, False] + elif high_threshold != NOT_AVAILABLE and value > int(high_threshold): + if name == "PSU1_VOut" or name == "PSU2_VOut": + self.log_warning('sensor %s: %d higher than threshold %d\n' % (name, value, high_threshold)) + warning = [True, True, False] + else: + self.log_notice('sensor %s: %d higher than threshold %d\n' % (name, value, high_threshold)) + warning = [True, False, False] + elif low_critical_threshold != NOT_AVAILABLE and value < int(low_critical_threshold): + self.log_warning('sensor %s: %d lower than critical threshold %d\n' % (name, value, low_critical_threshold)) + warning = [False, True, False] + elif low_threshold != NOT_AVAILABLE and value < int(low_threshold): + self.log_notice('sensor %s: %d lower than threshold %d\n' % (name, value, low_threshold)) + warning = [True, False, False] + else: + warning = [False, False, False] + + return warning + + +class PsuUpdater(logger.Logger): + """ + PsuUpdater + """ + + def __init__(self, log_identifier, _psu_list): + + super(PsuUpdater, self).__init__(log_identifier) + self.logger = logger.Logger(SYSLOG_IDENTIFIER) + self._psu_list = _psu_list + + def update(self): + self.log_debug("Start PSU updating") + for index, psu in enumerate(self._psu_list): + try: + warning = self._refresh_psu_status(psu, index) + if warning is True: + return True + except Exception as E: + self.log_warning('Failed to update psu status - {}'.format(repr(E))) + + self.log_debug("End PSU updating") + + return False + + def _refresh_psu_status(self, psu, index): + name = try_get(psu.get_name, 'psu {}'.format(index + 1)) + + presence = try_get(psu.get_presence) + if presence is True: + powergood_status = try_get(psu.get_powergood_status) + else: + self.log_warning("%s is not present\n" % name) + return True + + if powergood_status is False: + self.log_warning('%s status is not OK\n' % name) + return True + else: + return False + + +class FanUpdater(logger.Logger): + """ + FanUpdater + """ + + def __init__(self, log_identifier, _fan_list): + + super(FanUpdater, self).__init__(log_identifier) + self.logger = logger.Logger(SYSLOG_IDENTIFIER) + self._fan_list = _fan_list + + def update(self): + self.log_debug("Start fan updating") + for index, fan in enumerate(self._fan_list): + try: + warning = self._refresh_fan_status(fan, index) + if warning is True: + return True + except Exception as E: + self.log_warning('Failed to update fan status - {}'.format(repr(E))) + + self.log_debug("End fan updating") + + return False + + def _refresh_fan_status(self, fan, index): + name = try_get(fan.get_name, 'fan {}'.format(index + 1)) + + presence = try_get(fan.get_presence) + if presence is True: + status = try_get(fan.get_status) + else: + self.log_warning("%s is not present\n" % name) + return True + + if status is False: + self.log_warning('%s status is not OK\n' % name) + return True + else: + return False + + +# +# Main ========================================================================= +# +def main(): + _miscsensors_list, _psu_list, _thermal_list, _fan_list = list(), list(), list(), list() + + # initialize thermal object + airflow = __get_air_flow() + for index in range(0, NUM_THERMAL): + _thermal = Thermal(index, airflow) + _thermal_list.append(_thermal) + + # initialize PSU object + for index in range(0, NUM_PSU): + _psu = Psu(index) + _psu_list.append(_psu) + + # initialize miscellaneous object + for index in range(0, NUM_MISC_SENSORS_PWR): + _miscsensors = MiscSensors(index) + _miscsensors_list.append(_miscsensors) + + # initialize fan object + for fant_index in range(0, NUM_FAN_TRAY): + for fan_index in range(0, NUM_FAN_PER_TRAY): + fan = Fan(fant_index, fan_index) + _fan_list.append(fan) + for fan_index in range(0, PSU_NUM_FAN): + fan = Fan(fan_index, 0, is_psu_fan=True, psu_index=fan_index + 1) + _fan_list.append(fan) + + while True: + temperature_obj = TemperatureUpdater(SYSLOG_IDENTIFIER, _thermal_list) + temperature_warning = temperature_obj.update() + + psu_obj = PsuUpdater(SYSLOG_IDENTIFIER, _psu_list) + psu_warning = psu_obj.update() + + fan_obj = FanUpdater(SYSLOG_IDENTIFIER, _fan_list) + fan_warning = fan_obj.update() + + miscsensors_obj = MiscSensorsUpdater(SYSLOG_IDENTIFIER, _miscsensors_list) + miscsensors_warning = miscsensors_obj.update() + + if any(temperature_warning) or any(miscsensors_warning) or psu_warning or fan_warning: + if temperature_warning[2] is True or miscsensors_warning[2] is True: + alarm_led_blink(ALAEM_LED_AMBER) + elif temperature_warning[1] is True or miscsensors_warning[1] is True or psu_warning or fan_warning: + alarm_led_blink(ALAEM_LED_4HZ) + else: + alarm_led_blink(ALAEM_LED_1HZ) + else: + alarm_led_blink(ALAEM_LED_GREEN) + time.sleep(2) + + +if __name__ == '__main__': + main() diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/plugins/eeprom.py b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/eeprom.py new file mode 100644 index 00000000000..84bd13d312a --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/eeprom.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica Silverstone-x +# +# 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: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, 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 = "/sys/class/i2c-adapter/i2c-0/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/plugins/misc_sensors.py b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/misc_sensors.py new file mode 100644 index 00000000000..664837c7657 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/misc_sensors.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python + +import os +import os . path + +try: + from sonic_platform.helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NULL_VAL = "N/A" + +MISC_SENSORS_INFO = [ + {'name': 'BB_XP12R0V', # 0 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in1_input'}, + {'name': 'BB_XP5R0V', # 1 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in2_input'}, + {'name': 'COME_XP3R3V', # 2 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in3_input'}, + {'name': 'COME_XP1R82V', # 3 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in4_input'}, + {'name': 'COME_XP1R05V', # 4 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in5_input'}, + {'name': 'COME_XP1R7V', # 5 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in6_input'}, + {'name': 'COME_XP1R2V', # 6 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in7_input'}, + {'name': 'COME_XP1R3V', # 7 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in8_input'}, + {'name': 'COME_XP1R5V', # 8 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in9_input'}, + {'name': 'COME_XP2R5V', # 9 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in10_input'}, + {'name': 'COME_XP12R0V', # 10 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in11_input'}, + {'name': 'SSD_XP3R3V', # 11 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0035/hwmon/hwmon*/in12_input'}, + {'name': 'SW_XP5R0V_C', # 12 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in1_input'}, + {'name': 'SW_XP3R3V_C', # 13 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in2_input'}, + {'name': 'SW_XP3R3V_L', # 14 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in3_input'}, + {'name': 'SW_XP3R3V_R', # 15 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in4_input'}, + {'name': 'SW_XP3R3V_FPGA', # 16 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in5_input'}, + {'name': 'SW_XP1R8V_FPGA', # 17 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in6_input'}, + {'name': 'SW_XP1R8V_VDDH', # 18 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in7_input'}, + {'name': 'SW_XP1R2V_FPGA', # 19 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in8_input'}, + {'name': 'SW_XP1R0V_FPGA', # 20 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in9_input'}, + {'name': 'SW_XP1R1V_AVDDH', # 21 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in10_input'}, + {'name': 'SW_XP0R94V_AVDD1', # 22 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in11_input'}, + {'name': 'SW_XP0R94V_AVDD2', # 23 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in12_input'}, + {'name': 'SW_XP0R9V_VDD', # 24 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in13_input'}, + {'name': 'SW_XP0R9V_AVDD', # 25 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in14_input'}, + {'name': 'SW_0R8V_VDD', # 26 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in15_input'}, + {'name': 'SW_XP12R0V', # 27 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-0034/hwmon/hwmon*/in16_input'}, + {'name': 'QSFP_DD_VOut1', # 28 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-007b/hwmon/hwmon*/in2_input'}, + {'name': 'QSFP_DD_COut1', # 29 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-007b/hwmon/hwmon*/curr2_input'}, + {'name': 'QSFP_DD_POut1', # 30 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-007b/hwmon/hwmon*/power2_input'}, + {'name': 'QSFP_DD_VOut2', # 31 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0076/hwmon/hwmon*/in2_input'}, + {'name': 'QSFP_DD_COut2', # 32 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0076/hwmon/hwmon*/curr2_input'}, + {'name': 'QSFP_DD_POut2', # 33 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0076/hwmon/hwmon*/power2_input'}, + {'name': 'I89_AVDD_VOut1', # 34 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0070/hwmon/hwmon*/in2_input'}, + {'name': 'I89_AVDD_COut1', # 35 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0070/hwmon/hwmon*/curr2_input'}, + {'name': 'I89_AVDD_POut1', # 36 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0070/hwmon/hwmon*/power2_input'}, + {'name': 'I89_AVDDH_VOut2', # 37 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0070/hwmon/hwmon*/in3_input'}, + {'name': 'I89_AVDDH_COut2', # 38 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0070/hwmon/hwmon*/curr3_input'}, + {'name': 'I89_AVDDH_POut2', # 39 + 'sensor_path': 'i2cget -y -f 5 0x70 0x96 w'}, + {'name': 'I89_CORE_VOut', # 40 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-006c/hwmon/hwmon*/in2_input'}, + {'name': 'I89_CORE_COut', # 41 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-006c/hwmon/hwmon*/curr1_input'}, + {'name': 'I89_CORE_POut', # 42 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-006c/hwmon/hwmon*/power1_input'}, + {'name': 'I89_CORE_Temp', # 43 + 'sensor_path': '/sys/bus/i2c/devices/i2c-4/4-006c/hwmon/hwmon*/temp1_input'}, + {'name': 'I89_AVDD_Temp', # 44 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0070/hwmon/hwmon*/temp1_input'}, + {'name': 'QSFP_DD_Temp1', # 45 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-007b/hwmon/hwmon*/temp1_input'}, + {'name': 'QSFP_DD_Temp2', # 46 + 'sensor_path': '/sys/bus/i2c/devices/i2c-5/5-0076/hwmon/hwmon*/temp1_input'}, + {'name': 'PSU1_Fan', # 47 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0058/hwmon/hwmon*/fan1_input'}, + {'name': 'PSU2_Fan', # 48 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0059/hwmon/hwmon*/fan1_input'}, + {'name': 'Fan1_Front', # 49 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan1_front_speed_rpm'}, + {'name': 'Fan2_Front', # 50 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan2_front_speed_rpm'}, + {'name': 'Fan3_Front', # 51 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan3_front_speed_rpm'}, + {'name': 'Fan4_Front', # 52 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan4_front_speed_rpm'}, + {'name': 'Fan5_Front', # 53 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan5_front_speed_rpm'}, + {'name': 'Fan6_Front', # 54 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan6_front_speed_rpm'}, + {'name': 'Fan7_Front', # 55 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan7_front_speed_rpm'}, + {'name': 'Fan1_Rear', # 56 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan1_rear_speed_rpm'}, + {'name': 'Fan2_Rear', # 57 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan2_rear_speed_rpm'}, + {'name': 'Fan3_Rear', # 58 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan3_rear_speed_rpm'}, + {'name': 'Fan4_Rear', # 59 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan4_rear_speed_rpm'}, + {'name': 'Fan5_Rear', # 60 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan5_rear_speed_rpm'}, + {'name': 'Fan6_Rear', # 61 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan6_rear_speed_rpm'}, + {'name': 'Fan7_Rear', # 62 + 'sensor_path': '/sys/bus/i2c/devices/i2c-9/9-000d/fan7_rear_speed_rpm'}, + {'name': 'PSU1_VIn', # 63 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0058/hwmon/hwmon*/in1_input'}, + {'name': 'PSU1_CIn', # 64 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0058/hwmon/hwmon*/curr1_input'}, + {'name': 'PSU1_PIn', # 65 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0058/hwmon/hwmon*/power1_input'}, + {'name': 'PSU1_VOut', # 66 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0058/hwmon/hwmon*/in2_input'}, + {'name': 'PSU1_COut', # 67 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0058/hwmon/hwmon*/curr2_input'}, + {'name': 'PSU1_POut', # 68 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0058/hwmon/hwmon*/power2_input'}, + {'name': 'PSU2_VIn', # 69 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0059/hwmon/hwmon*/in1_input'}, + {'name': 'PSU2_CIn', # 70 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0059/hwmon/hwmon*/curr1_input'}, + {'name': 'PSU2_PIn', # 71 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0059/hwmon/hwmon*/power1_input'}, + {'name': 'PSU2_VOut', # 72 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0059/hwmon/hwmon*/in2_input'}, + {'name': 'PSU2_COut', # 73 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0059/hwmon/hwmon*/curr2_input'}, + {'name': 'PSU2_POut', # 74 + 'sensor_path': '/sys/bus/i2c/devices/i2c-7/7-0059/hwmon/hwmon*/power2_input'}, +] + +misc_sensors_threshold = { + "BB_XP12R0V": {"low_critical_threshold": 10200, "min": 10800, "max": 13200, "high_critical_threshold": 13800}, + "BB_XP5R0V": {"low_critical_threshold": 4230, "min": 4500, "max": 5490, "high_critical_threshold": 5730}, + "COME_XP3R3V": {"low_critical_threshold": 2800, "min": 2960, "max": 3620, "high_critical_threshold": 3800}, + "COME_XP1R82V": {"low_critical_threshold": 1550, "min": 1640, "max": 2000, "high_critical_threshold": 2090}, + "COME_XP1R05V": {"low_critical_threshold": 890, "min": 950, + "max": 1160, "high_critical_threshold": 1210}, + "COME_XP1R7V": {"low_critical_threshold": 1450, "min": 1530, + "max": 1870, "high_critical_threshold": 1960}, + "COME_XP1R2V": {"low_critical_threshold": 1020, "min": 1080, + "max": 1320, "high_critical_threshold": 1380}, + "COME_XP1R3V": {"low_critical_threshold": 1110, "min": 1170, + "max": 1430, "high_critical_threshold": 1500}, + "COME_XP1R5V": {"low_critical_threshold": 1280, "min": 1350, + "max": 1650, "high_critical_threshold": 1720}, + "COME_XP2R5V": {"low_critical_threshold": 2120, "min": 2240, + "max": 2740, "high_critical_threshold": 2860}, + "COME_XP12R0V": {"low_critical_threshold": 10200, "min": 10800, + "max": 13200, "high_critical_threshold": 13800}, + "SSD_XP3R3V": {"low_critical_threshold": 2800, "min": 2960, + "max": 3620, "high_critical_threshold": 3800}, + "SW_XP5R0V_C": {"low_critical_threshold": 4260, "min": 4500, + "max": 5490, "high_critical_threshold": 5760}, + "SW_XP3R3V_C": {"low_critical_threshold": 2800, "min": 2980, + "max": 3620, "high_critical_threshold": 3800}, + "SW_XP3R3V_L": {"low_critical_threshold": 2800, "min": 2980, + "max": 3620, "high_critical_threshold": 3800}, + "SW_XP3R3V_R": {"low_critical_threshold": 2800, "min": 2980, + "max": 3620, "high_critical_threshold": 3800}, + "SW_XP3R3V_FPGA": {"low_critical_threshold": 2800, "min": 2980, + "max": 3620, "high_critical_threshold": 3800}, + "SW_XP1R8V_FPGA": {"low_critical_threshold": 1530, "min": 1620, + "max": 1980, "high_critical_threshold": 2070}, + "SW_XP1R8V_VDDH": {"low_critical_threshold": 1530, "min": 1620, + "max": 1980, "high_critical_threshold": 2070}, + "SW_XP1R2V_FPGA": {"low_critical_threshold": 1020, "min": 1080, + "max": 1320, "high_critical_threshold": 1380}, + "SW_XP1R0V_FPGA": {"low_critical_threshold": 850, "min": 900, + "max": 1100, "high_critical_threshold": 1150}, + "SW_XP1R1V_AVDDH": {"low_critical_threshold": 940, "min": 990, + "max": 1210, "high_critical_threshold": 1270}, + "SW_XP0R94V_AVDD1": {"low_critical_threshold": 800, "min": 850, + "max": 1030, "high_critical_threshold": 1080}, + "SW_XP0R94V_AVDD2": {"low_critical_threshold": 800, "min": 850, + "max": 1030, "high_critical_threshold": 1080}, + "SW_XP0R9V_VDD": {"low_critical_threshold": 770, "min": 810, + "max": 990, "high_critical_threshold": 1040}, + "SW_XP0R9V_AVDD": {"low_critical_threshold": 770, "min": 810, + "max": 990, "high_critical_threshold": 1040}, + "SW_0R8V_VDD": {"low_critical_threshold": 680, "min": 720, + "max": 880, "high_critical_threshold": 920}, + "SW_XP12R0V": {"low_critical_threshold": 10200, "min": 10800, + "max": 13200, "high_critical_threshold": 13800}, + "QSFP_DD_VOut1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "QSFP_DD_COut1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "QSFP_DD_POut1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "QSFP_DD_VOut2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "QSFP_DD_COut2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "QSFP_DD_POut2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_AVDD_VOut1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_AVDD_COut1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_AVDD_POut1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_AVDDH_VOut2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_AVDDH_COut2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_AVDDH_POut2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_CORE_VOut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_CORE_COut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_CORE_POut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_CORE_Temp": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I89_AVDD_Temp": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "QSFP_DD_Temp1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "QSFP_DD_Temp2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "PSU1_Fan": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": 33400, "high_critical_threshold": NULL_VAL}, + "PSU2_Fan": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": 33400, "high_critical_threshold": NULL_VAL}, + "Fan1_Front": {"low_critical_threshold": 2200, "min": NULL_VAL, + "max": 37800, "high_critical_threshold": NULL_VAL}, + "Fan2_Front": {"low_critical_threshold": 2200, "min": NULL_VAL, + "max": 37800, "high_critical_threshold": NULL_VAL}, + "Fan3_Front": {"low_critical_threshold": 2200, "min": NULL_VAL, + "max": 37800, "high_critical_threshold": NULL_VAL}, + "Fan4_Front": {"low_critical_threshold": 2200, "min": NULL_VAL, + "max": 37800, "high_critical_threshold": NULL_VAL}, + "Fan5_Front": {"low_critical_threshold": 2200, "min": NULL_VAL, + "max": 37800, "high_critical_threshold": NULL_VAL}, + "Fan6_Front": {"low_critical_threshold": 2200, "min": NULL_VAL, + "max": 37800, "high_critical_threshold": NULL_VAL}, + "Fan7_Front": {"low_critical_threshold": 2200, "min": NULL_VAL, + "max": 37800, "high_critical_threshold": NULL_VAL}, + "Fan1_Rear": {"low_critical_threshold": 2400, "min": NULL_VAL, + "max": 40000, "high_critical_threshold": NULL_VAL}, + "Fan2_Rear": {"low_critical_threshold": 2400, "min": NULL_VAL, + "max": 40000, "high_critical_threshold": NULL_VAL}, + "Fan3_Rear": {"low_critical_threshold": 2400, "min": NULL_VAL, + "max": 40000, "high_critical_threshold": NULL_VAL}, + "Fan4_Rear": {"low_critical_threshold": 2400, "min": NULL_VAL, + "max": 40000, "high_critical_threshold": NULL_VAL}, + "Fan5_Rear": {"low_critical_threshold": 2400, "min": NULL_VAL, + "max": 40000, "high_critical_threshold": NULL_VAL}, + "Fan6_Rear": {"low_critical_threshold": 2400, "min": NULL_VAL, + "max": 40000, "high_critical_threshold": NULL_VAL}, + "Fan7_Rear": {"low_critical_threshold": 2400, "min": NULL_VAL, + "max": 40000, "high_critical_threshold": NULL_VAL}, + "PSU1_VIn": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 239800, "high_critical_threshold": 264000}, + "PSU1_CIn": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 14080}, + "PSU1_PIn": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 1500000000}, + "PSU1_VOut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 13500, "high_critical_threshold": 15600}, + "PSU1_COut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 125000, "high_critical_threshold": NULL_VAL}, + "PSU1_POut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 1500000000}, + "PSU2_VIn": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 239800, "high_critical_threshold": 264000}, + "PSU2_CIn": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 14080}, + "PSU2_PIn": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 1500000000}, + "PSU2_VOut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 13500, "high_critical_threshold": 15600}, + "PSU2_COut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 125000, "high_critical_threshold": NULL_VAL}, + "PSU2_POut": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 1500000000}, +} + +class MiscSensors(): + + def __init__(self, Voltage_index): + + self.index = Voltage_index + self._api_helper = APIHelper () + self._misc_sensors_info = MISC_SENSORS_INFO[self.index] + self.name = self.get_name() + + def get_miscsensors_value(self): + path = self._misc_sensors_info.get("sensor_path", "N/A") + if "i2cget" in path: + status, voltage = self._api_helper.run_command(path) + voltage = int(voltage, 16) + else: + path = os.popen("ls %s" % path).read().strip() + voltage = self._api_helper.read_txt_file(path) + if voltage: + voltage = int(voltage) + else: + voltage = 0 + + return voltage + + def get_high_threshold(self): + """ + Retrieves the high threshold voltage of Voltage + Returns: + A float number, the high threshold voltage of Voltage in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + high_threshold = misc_sensors_threshold.get(self.name).get("max") + + return high_threshold + + def get_low_threshold(self): + """ + Retrieves the low threshold voltage of Voltage + Returns: + A float number, the low threshold voltage of Voltage in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + low_threshold = misc_sensors_threshold.get(self.name).get("min") + return low_threshold + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold voltage of Voltage + Returns: + A float number, the high critical threshold voltage of Voltage in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + high_critical_threshold = misc_sensors_threshold.get(self.name).get("high_critical_threshold") + return high_critical_threshold + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold voltage of Voltage + Returns: + A float number, the low critical threshold voltage of Voltage in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + low_critical_threshold = misc_sensors_threshold.get(self.name).get("low_critical_threshold") + return low_critical_threshold + + def get_name(self): + """ + Retrieves the name of the Voltage device + Returns: + string: The name of the Voltage device + """ + return self._misc_sensors_info.get("name") + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + return os.path.isfile(self._misc_sensors_info.get("sensor_path", NULL_VAL)) + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + return True diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/plugins/psuutil.py b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/psuutil.py new file mode 100644 index 00000000000..56a350b8227 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/psuutil.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +import subprocess +import sys +import re + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + self.ipmi_raw = "docker exec -ti pmon ipmitool raw 0x4 0x2d" + self.psu1_id = "0x3a" + self.psu2_id = "0x3b" + PsuBase.__init__(self) + + def run_command(self, command): + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + (out, err) = proc.communicate() + + if proc.returncode != 0: + sys.exit(proc.returncode) + + return out + + def find_value(self, in_string): + result = re.search("^.+ ([0-9a-f]{2}) .+$", in_string) + if result: + return result.group(1) + else: + return result + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + psu_id = self.psu1_id if index == 1 else self.psu2_id + res_string = self.run_command(self.ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + failure_detected = (int(status_byte, 16) >> 1) & 1 + input_lost = (int(status_byte, 16) >> 3) & 1 + if failure_detected or input_lost: + return False + else: + return True + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + psu_id = self.psu1_id if index == 1 else self.psu2_id + res_string = self.run_command(self.ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + presence = ( int(status_byte, 16) >> 0 ) & 1 + if presence: + return True + else: + return False diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/plugins/sfputil.py b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/sfputil.py new file mode 100755 index 00000000000..54d6e04a25e --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/plugins/sfputil.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python +# +# Platform-specific SFP transceiver interface for SONiC +# This plugin supports QSFP-DD, QSFP and SFP. + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 33 + OSFP_PORT_START = 0 + OSFP_PORT_END = 31 + SFP_PORT_START = 32 + SFP_PORT_END = 33 + + EEPROM_OFFSET = 12 + QSFP_PORT_INFO_PATH = '/sys/class/SFF' + SFP_PORT_INFO_PATH = '/sys/devices/platform/fpga-xcvr' + PORT_INFO_PATH = QSFP_PORT_INFO_PATH + + OSFP_INFO_PAGE = 0 + PAGE_SELETCT_OFFSET = 127 + + _port_name = "" + _port_to_eeprom_mapping = {} + _port_to_i2cbus_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return [] + + @property + def osfp_ports(self): + return range(self.OSFP_PORT_START, self.OSFP_PORT_END + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def port_to_i2cbus_mapping(self): + return self._port_to_i2cbus_mapping + + @property + def get_transceiver_status(self): + content = 0 + port = 0 + try: + while self.port_start <= port <= self.port_end: + if self.get_presence(port): + content = content | (1 << port) + port = port + 1 + + except IOError as error: + print("Error: unable to open file: %s" % str(error)) + return False + + return content + + def get_port_name(self, port_num): + if port_num in self.osfp_ports: + self._port_name = "QSFP" + str(port_num - self.OSFP_PORT_START + 1) + else: + self._port_name = "SFP" + str(port_num - self.SFP_PORT_START + 1) + return self._port_name + + def get_eeprom_dom_raw(self, port_num): + if port_num in self.osfp_ports: + # QSFP DOM EEPROM is also at addr 0x50 and thus also stored in eeprom_ifraw + return None + else: + # Read dom eeprom at addr 0x51 + return self._read_eeprom_devid(port_num, self.DOM_EEPROM_ADDR, 256) + + def __write_eeprom_specific_bytes(self, port_num, offset, write_bytes): + """ + Writes bytes to sfp eeprom + Args: + offset: integer, 0-0xff + bytes : list, [0x12, 0x13, ...], bytes to write + Returns: + A boolean, True if bytes are written successfully, False if not + """ + + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[port_num] + try: + with open(sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) as sysfsfile_eeprom: + sysfsfile_eeprom.seek(offset) + for i in range(len(write_bytes)): + sysfsfile_eeprom.write(chr(write_bytes[i])) + except Exception as error: + # print(str(error)) + return False + + def __init__(self): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + + for x in range(self.PORT_START, self.PORT_END + 1): + self.port_to_i2cbus_mapping[x] = (x + self.EEPROM_OFFSET) + self.port_to_eeprom_mapping[x] = eeprom_path.format( + x + self.EEPROM_OFFSET) + # Get Transceiver status + self.modprs_register = self.get_transceiver_status + + # All SFPs' eeprom switch to page 0 + for x in range(self.PORT_START, self.PORT_END + 1): + if self.get_presence(x): + self.__write_eeprom_specific_bytes(x, self.PAGE_SELETCT_OFFSET, [self.OSFP_INFO_PAGE]) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num not in range(self.port_start, self.port_end + 1): + return False + + # Get path for access port presence status + port_name = self.get_port_name(port_num) + sysfs_filename = "qsfp_modprs" if port_num in self.osfp_ports else "sfp_modabs" + self.PORT_INFO_PATH = self.QSFP_PORT_INFO_PATH if port_num in self.osfp_ports else self.SFP_PORT_INFO_PATH + reg_path = "/".join([self.PORT_INFO_PATH, port_name, sysfs_filename]) + + # Read status + try: + reg_file = open(reg_path) + content = reg_file.readline().rstrip() + reg_value = int(content) + except IOError as e: + print ("Error: unable to open file: %s" % str(e)) + return False + + # Module present is active low + if reg_value == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid QSFP port_num + self.PORT_INFO_PATH = self.QSFP_PORT_INFO_PATH if port_num in self.osfp_ports else self.SFP_PORT_INFO_PATH + if port_num not in self.osfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_lpmode"])) + except IOError as error: + print ("Error: unable to open file: %s" % str(error)) + return False + + # Read status + content = reg_file.readline().rstrip() + reg_value = int(content) + # low power mode is active high + if reg_value == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid QSFP port_num + self.PORT_INFO_PATH = self.QSFP_PORT_INFO_PATH if port_num in self.osfp_ports else self.SFP_PORT_INFO_PATH + if port_num not in self.osfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_lpmode"]), "r+") + except IOError as e: + print ("Error: unable to open file: %s" % str(e)) + return False + + content = hex(lpmode) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + # Check for invalid QSFP port_num + self.PORT_INFO_PATH = self.QSFP_PORT_INFO_PATH if port_num in self.osfp_ports else self.SFP_PORT_INFO_PATH + if port_num not in self.osfp_ports: + return False + + try: + port_name = self.get_port_name(port_num) + reg_file = open("/".join([self.PORT_INFO_PATH, + port_name, "qsfp_reset"]), "w") + except IOError as e: + print ("Error: unable to open file: %s" % str(e)) + return False + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(0)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open( + "/".join([self.PORT_INFO_PATH, port_name, "qsfp_reset"]), "w") + except IOError as e: + print ("Error: unable to open file: %s" % str(e)) + return False + + reg_file.seek(0) + reg_file.write(hex(1)) + reg_file.close() + + return True + + def get_transceiver_change_event(self, timeout=0): + + start_time = time.time() + port_dict = {} + port = self.port_start + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print ("get_transceiver_change_event:Invalid timeout value") + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print ('get_transceiver_change_event:' \ + 'time wrap / invalid timeout value') + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + # Check for OIR events and return updated port_dict + reg_value = self.get_transceiver_status + if reg_value != self.modprs_register: + changed_ports = self.modprs_register ^ reg_value + while port >= self.port_start and port <= self.port_end: + + # Mask off the bit corresponding to our port + mask = (1 << port) + + if changed_ports & mask: + # ModPrsL is active low + if reg_value & mask == 0: + port_dict[port] = '1' + else: + port_dict[port] = '0' + + port += 1 + + # Update reg value + self.modprs_register = reg_value + return True, port_dict + + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, {} + print ("get_transceiver_change_event: Should not reach here.") + return False, {} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/pmon_daemon_control.json b/device/celestica/x86_64-cel_silverstone-x-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/__init__.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/__init__.py new file mode 100644 index 00000000000..d82f3749319 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis"] +from sonic_platform import * diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/chassis.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/chassis.py new file mode 100644 index 00000000000..74d967f2d87 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/chassis.py @@ -0,0 +1,435 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# + +try: + import sys + import time + from sonic_platform_base.chassis_base import ChassisBase + from .thermal_manager import ThermalManager + from sonic_platform.sfp import Sfp + from sonic_platform.psu import Psu + from sonic_platform.fan import Fan + from sonic_platform.thermal import Thermal + from sonic_platform.eeprom import Tlv + from sonic_platform.component import Component + from sonic_platform.watchdog import Watchdog + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN_TRAY = 7 +NUM_FAN = 2 +NUM_PSU = 2 +NUM_THERMAL = 19 +# should be 34 including 32 QSFP-DD and 2 SFP, here change to suit SDK port_config.ini +NUM_SFP = 32 +NUM_COMPONENT = 10 +RESET_REGISTER = "0xA106" +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +GETREG_PATH = "/sys/devices/platform/sys_cpld/getreg" +HOST_CHK_CMD = "docker > /dev/null 2>&1" +IPMI_AIR_FLOW_CMD = "0x62 {}" +IPMI_OEM_NETFN = "0x3A" + + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + ChassisBase.__init__(self) + self._api_helper = APIHelper() + + self.port_start = 0 + self.port_end = NUM_SFP - 1 + self.fan_start = 0 + self.fan_end = NUM_FAN_TRAY - 1 + self.sfp_module_initialized = False + self.fan_module_initialized = False + self._eeprom = Tlv() + self.is_host = self._api_helper.is_host() + + #if not self.is_host: + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + #else: + self.__initialize_components() + self.modprs_register = self.get_transceiver_status() + self.fan_init_status = self.get_fan_status() + + def __initialize_sfp(self): + for index in range(0, NUM_SFP): + sfp = Sfp(index) + self._sfp_list.append(sfp) + self.sfp_module_initialized = True + + def __initialize_psu(self): + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_fan(self): + for fant_index in range(0, NUM_FAN_TRAY): + for fan_index in range(0, NUM_FAN): + fan = Fan(fant_index, fan_index) + self._fan_list.append(fan) + self.fan_module_initialized = True + + def __initialize_thermals(self): + airflow = self.__get_air_flow() + for index in range(0, NUM_THERMAL): + thermal = Thermal(index, airflow) + self._thermal_list.append(thermal) + + def __initialize_components(self): + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + + def __get_air_flow(self): + status, air_flow =self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_AIR_FLOW_CMD.format("00")) + if status and air_flow == "01": + return 'B2F' + elif status and air_flow == "00": + return 'F2B' + + 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.get_mac() + + 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.get_serial() + + 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.get_eeprom() + + 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. + + REBOOT_CAUSE_POWER_LOSS = "Power Loss" + REBOOT_CAUSE_THERMAL_OVERLOAD_CPU = "Thermal Overload: CPU" + REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC = "Thermal Overload: ASIC" + REBOOT_CAUSE_THERMAL_OVERLOAD_OTHER = "Thermal Overload: Other" + REBOOT_CAUSE_INSUFFICIENT_FAN_SPEED = "Insufficient Fan Speed" + REBOOT_CAUSE_WATCHDOG = "Watchdog" + REBOOT_CAUSE_HARDWARE_OTHER = "Hardware - Other" + REBOOT_CAUSE_NON_HARDWARE = "Non-Hardware" + + """ + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) + sw_reboot_cause = self._api_helper.read_txt_file( + reboot_cause_path) or "Unknown" + hw_reboot_cause = self._api_helper.get_cpld_reg_value( + GETREG_PATH, RESET_REGISTER) + + prev_reboot_cause = { + '0x11': (self.REBOOT_CAUSE_POWER_LOSS, "The last reset is Power on reset"), + '0x22': (self.REBOOT_CAUSE_HARDWARE_OTHER, "The last reset is soft-set CPU warm reset"), + '0x33': (self.REBOOT_CAUSE_HARDWARE_OTHER, "The last reset is soft-set CPU cold reset"), + '0x44': (self.REBOOT_CAUSE_NON_HARDWARE, "The last reset is CPU warm reset"), + '0x55': (self.REBOOT_CAUSE_NON_HARDWARE, "The last reset is CPU cold reset"), + '0x66': (self.REBOOT_CAUSE_WATCHDOG, "The last reset is watchdog reset"), + '0x77': (self.REBOOT_CAUSE_HARDWARE_OTHER, "The last reset is power cycle reset") + + }.get(hw_reboot_cause, (self.REBOOT_CAUSE_HARDWARE_OTHER, 'Unknown reason')) + + if sw_reboot_cause != 'Unknown': + prev_reboot_cause = ( + self.REBOOT_CAUSE_NON_HARDWARE, sw_reboot_cause) + + return prev_reboot_cause + + ############################################################## + ####################### SFP methods ########################## + ############################################################## + + def get_num_sfps(self): + """ + Retrieves the number of sfps available on this chassis + Returns: + An integer, the number of sfps available on this chassis + """ + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return len(self._sfp_list) + + def get_all_sfps(self): + """ + Retrieves all sfps available on this chassis + Returns: + A list of objects derived from SfpBase representing all sfps + available on this chassis + """ + if not self.sfp_module_initialized: + self.__initialize_sfp() + + return self._sfp_list + + def get_sfp(self, index): + """ + Retrieves sfp represented by (0-based) 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 + if not self.sfp_module_initialized: + self.__initialize_sfp() + + try: + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (0-{})\n".format( + index, len(self._sfp_list))) + return sfp + + ############################################################## + ####################### Other methods ######################## + ############################################################## + + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + if self._watchdog is None: + self._watchdog = Watchdog() + + return self._watchdog + + ############################################################# + ##################### Device methods ######################## + ############################################################# + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self._api_helper.hwsku + + @staticmethod + def get_presence(): + """ + 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 device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_pn() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self.get_serial_number() + + @staticmethod + def get_status(): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return True + + @staticmethod + def get_thermal_manager(): + return ThermalManager + + def get_fan_status(self): + if not self.fan_module_initialized: + self.__initialize_fan() + + content = 0 + for fan in self._fan_list: + if fan.get_presence(): + content = content << 1 | 1 + else: + content = content << 1 + + return content + + def get_transceiver_status(self): + if not self.sfp_module_initialized: + self.__initialize_sfp() + + content = 0 + index = 0 + for sfp in self.get_all_sfps(): + if sfp.get_presence(): + content = content | (1 << index) + index = index + 1 + return content + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + + Returns: + (bool, dict): + - True if call successful, False if not; + - A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, + where device_id is the device ID for this device and + device_event, + status='1' represents device inserted, + status='0' represents device removed. + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0'}} + indicates that fan 0 has been removed, fan 2 + has been inserted and sfp 11 has been removed. + Specifically for SFP event, besides SFP plug in and plug out, + there are some other error event could be raised from SFP, when + these error happened, SFP eeprom will not be avalaible, XCVRD shall + stop to read eeprom before SFP recovered from error status. + status='2' I2C bus stuck, + status='3' Bad eeprom, + status='4' Unsupported cable, + status='5' High Temperature, + status='6' Bad cable. + """ + + start_time = time.time() + port_dict = {} + fan_dict = {} + change_dict = {'fan': {}, 'sfp': {}} + port = self.port_start + fan = self.fan_start + forever = False + change_event = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_transceiver_change_event:Invalid timeout value", timeout) + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print('get_transceiver_change_event: time wrap, invalid timeout value', timeout) + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + # Check for OIR events and return updated port_dict + reg_value = self.get_transceiver_status() + if reg_value != self.modprs_register: + changed_ports = self.modprs_register ^ reg_value + while self.port_start <= port <= self.port_end: + + # Mask off the bit corresponding to our port + mask = (1 << port) + + if changed_ports & mask: + # ModPrsL is active low + if reg_value & mask == 0: + port_dict[port] = '0' + else: + port_dict[port] = '1' + + port += 1 + + # Update reg value + self.modprs_register = reg_value + change_dict['sfp'] = port_dict + change_event = True + value = self.get_fan_status() + if value != self.fan_init_status: + changed_fans = self.fan_init_status ^ value + while self.fan_start <= fan <= self.fan_end: + # Mask off the bit corresponding to our port + mask = (1 << fan) + + if changed_fans & mask: + # ModPrsL is active low + if value & mask == 0: + fan_dict[port] = '0' + else: + fan_dict[port] = '1' + + fan += 1 + + # Update reg value + self.fan_init_status = value + change_dict['fan'] = fan_dict + change_event = True + + if change_event: + return True, change_dict + + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_dict + print("get_transceiver_change_event: Should not reach here.") + return False, change_dict + + @staticmethod + def get_position_in_parent(): + return -1 diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/component.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/component.py new file mode 100644 index 00000000000..ee226642acc --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/component.py @@ -0,0 +1,358 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Component contains an implementation of SONiC Platform Base API and +# provides the components firmware management function +# +############################################################################# +try: + from sonic_platform_base.component_base import ComponentBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FPGA_VERSION_PATH = "/sys/devices/platform/fpga-sys/version" +SWCPLD1_VERSION_PATH = "/sys/bus/i2c/devices/i2c-10/10-0030/version" +SWCPLD2_VERSION_PATH = "/sys/bus/i2c/devices/i2c-10/10-0031/version" +BCPLD_VERSION_PATH = "/sys/devices/platform/sys_cpld/version" +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +Main_BMC_cmd = "ipmitool raw 0x32 0x8f 0x08 0x01" +Backup_BMC_cmd = "ipmitool raw 0x32 0x8f 0x08 0x02" +Fan_CPLD_cmd = "ipmitool raw 0x3a 0x64 02 01 00" +COME_CPLD_cmd = "ipmitool raw 0x3a 0x3e 1 0x1a 1 0xe0" +COMPONENT_NAME_LIST = ["FPGA", "COME_CPLD", "SWCPLD1", "SWCPLD2", "FANCPLD", "SYSCPLD", + "Main_BMC", "Backup_BMC", "Main_BIOS", "Backup_BIOS"] +COMPONENT_DES_LIST = ["Used for managering the CPU and expanding I2C channels", + "Used for managing the CPU", + "Used for managing QSFP+ ports (1-16)", + "Used for managing QSFP+ ports (17-32)", + "Used for managing fans", + "Used for managing control the system power & reset", + "Main Baseboard Management Controller", + "Backup Baseboard Management Controller", + "Main basic Input/Output System", + "Backup basic Input/Output System"] + + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index): + ComponentBase.__init__(self) + self.index = component_index + self._api_helper = APIHelper() + self.name = self.get_name() + + def __get_bios_version(self): + # Retrieves the BIOS firmware version + status,result = self._api_helper.run_command("ipmitool raw 0x3a 0x64 00 01 0x70") + if result.strip() == "01": + if self.name == "Main_BIOS": + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + elif self.name == "Backup_BIOS": + bios_version = "na" + return bios_version + + elif result.strip() == "03": + if self.name == "Backup_BIOS": + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + elif self.name == "Main_BIOS": + bios_version = "na" + return bios_version + + def __get_cpld_version(self): + if self.name == "COME_CPLD": + status, ver = self._api_helper.run_command(COME_CPLD_cmd) + version1 = int(ver.strip()) / 10 + version2 = int(ver.strip()) % 10 + version = "%s.%s" % (version1, version2) + return str(version) + elif self.name == "SWCPLD1": + try: + with open(SWCPLD1_VERSION_PATH, 'r') as fd: + swcpld1_version = fd.read() + return swcpld1_version.strip() + except Exception as e: + return None + elif self.name == "SYSCPLD": + try: + with open(BCPLD_VERSION_PATH, 'r') as fd: + bcpld_version = fd.read() + return bcpld_version.strip() + except Exception as e: + return None + elif self.name == "SWCPLD2": + try: + with open(SWCPLD2_VERSION_PATH, 'r') as fd: + swcpld2_version = fd.read() + return swcpld2_version.strip() + except Exception as e: + return None + elif self.name == "FANCPLD": + status,ver = self._api_helper.run_command(Fan_CPLD_cmd) + version1 = int(ver.strip()) / 10 + version2 = int(ver.strip()) % 10 + version = "%s.%s" % (version1, version2) + return str(version) + + def __get_fpga_version(self): + # Retrieves the FPGA firmware version + try: + with open(FPGA_VERSION_PATH, 'r') as fd: + version = fd.read() + fpga_version = (version.strip().split("x")[1]) + return fpga_version.strip() + except Exception as e: + return None + + def __get_bmc_version(self): + # Retrieves the BMC firmware version + cmd = Main_BMC_cmd if self.name == "Main_BMC" else Backup_BMC_cmd + stasus, ver = self._api_helper.run_command(cmd) + return ver.strip() + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_NAME_LIST[self.index] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_DES_LIST[self.index] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if "BIOS" in self.name: + fw_version = self.__get_bios_version() + elif "CPLD" in self.name: + fw_version = self.__get_cpld_version() + elif self.name == "FPGA": + fw_version = self.__get_fpga_version() + elif "BMC" in self.name: + version = self.__get_bmc_version() + version_1 = int(version.strip().split(" ")[0], 16) + version_2 = int(version.strip().split(" ")[1], 16) + fw_version = "%s.%s" % (version_1, version_2) + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + return False + # if not os.path.isfile(image_path): + # return False + # + # op_cmd = "ipmitool raw 0x32 0xaa 0x00" + # cl_cmd = "ipmitool raw 0x32 0xaa 0x01" + # if "FPGA" in self.name: + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/fpga_prog " \ + # "/sys/bus/pci/devices/0000:0b:00.0/resource0 %s" % image_path + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Programing is complete' in result: + # print("Update success") + # else: + # print("Update failed") + # + # elif self.name == "Main_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH " \ + # "-cd -d 2 -mse 1 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + # + # elif self.name == "Backup_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 2 -mse 2 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + # + # elif self.name == "Main_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 1 %s" % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...Plz wait for about 180s") + # else: + # print("Update failed") + # + # elif self.name == "Backup_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 2 %s" % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...") + # else: + # print("Update failed") + # + # elif "CPLD" in self.name: + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 4 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + # + # return status + def update_firmware(self, image_path): + #Not support + return False + + # if not os.path.isfile(image_path): + # return False + # + # op_cmd = "ipmitool raw 0x32 0xaa 0x00" + # cl_cmd = "ipmitool raw 0x32 0xaa 0x01" + # if "FPGA" in self.name: + # + # """img_name = os.path.basename(image_path) + # root, ext = os.path.splitext(img_name) + # ext = ".vme" if ext == "" else ext + # new_image_path = os.path.join("/tmp", (root.lower() + ext)) + # shutil.copy(image_path, new_image_path)""" + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/fpga_prog /sys/bus/pci/devices/0000:0b:00.0/resource0 %s" % image_path + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Programing is complete' in result: + # print("Update success") + # else: + # print("Update failed") + # + # elif self.name == "Main_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 2 -mse 1 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + # + # elif self.name == "Backup_BIOS": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 2 -mse 2 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + # + # elif self.name == "Main_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 1 %s" % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...Plz wait for about 180s") + # else: + # print("Update failed") + # + # elif self.name == "Backup_BMC": + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "/usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -fb -d 1 -mse 2 %s" % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # print("BMC is rebooting now...") + # else: + # print("Update failed") + # + # elif "CPLD" in self.name: + # self._api_helper.run_command(op_cmd) + # time.sleep(5) + # install_command = "echo y | /usr/local/lib/firmware/x86_64-cel_silverstone-x-r0/CFUFLASH -cd -d 4 %s " % image_path + # print("Updating now...Plz wait...") + # status, result = self._api_helper.run_command(install_command) + # if status is False: + # print("Running install command error") + # if 'Beginning to Deactive flashMode...end' in result: + # print("Update success") + # else: + # print("Update failed") + # time.sleep(10) + # self._api_helper.run_command(cl_cmd) + # + # return status diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/eeprom.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/eeprom.py new file mode 100644 index 00000000000..36402c20624 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/eeprom.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica Silverstone-x +# +# 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 glob + import os + import sys + import re + from cStringIO import StringIO + # from sonic_platform_base.sonic_eeprom import eeprom_dts + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' +TLV_EEPROM_I2C_BUS = 0 +TLV_EEPROM_I2C_ADDR = 56 + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + _TLV_DISPLAY_VENDOR_EXT = True + + def __init__(self): + self._eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-00{1}/eeprom".format(TLV_EEPROM_I2C_BUS, + TLV_EEPROM_I2C_ADDR) + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search('(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match: + idx = match.group(1) + value = match.group(3).rstrip('\0') + _eeprom_info_dict[idx] = value + except Exception: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + try: + self.read_eeprom_db() + except Exception: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if 'ok' not in status: + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except Exception: + pass + + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except Exception: + pass + + e = self.read_eeprom() + if e is None: + return 0 + try: + self.update_cache(e) + except Exception: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") + + def get_pn(self): + return self._eeprom.get('0x22', "Undefined.") \ No newline at end of file diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/fan.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/fan.py new file mode 100644 index 00000000000..b88cdf0a5a9 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/fan.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# +try: + from sonic_platform_base.fan_base import FanBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", "FAN-3F", "FAN-3R", + "FAN-4F", "FAN-4R", "FAN-5F", "FAN-5R", "FAN-6F", "FAN-6R", "FAN-7F", "FAN-7R"] + +IPMI_OEM_NETFN = "0x3A" + +IPMI_SET_FAN_SPEED_CMD = "0x26 {} {}" # IPMI_OEM_NETFN + 0x26 + fan id: 0-7 + pwm:20-100 +IPMI_AIR_FLOW_CMD = "0x62 {}" # IPMI_OEM_NETFN + 0x62 + fan id: 0-7 +IPMI_FAN_PRESENT_CMD = "0x26 0x03 {}" # IPMI_OEM_NETFN + 0x26 + fan id: 0-7 +IPMI_FAN_SPEED_CMD = "0x26 0x04 {}" # IPMI_OEM_NETFN + 0x26 + fan id: 0-7; RPM = readback value * 150 +IPMI_FAN_TARGET_SPEED_CMD = "0x64 0x02 0x01 {}" # IPMI_OEM_NETFN + 0x64 + fanboard id + r/w flag + REG + +FAN_TARGET_SPEED_REG = ["0x22", "0x32", "0x42", "0x52", "0x62", "0x72", + "0x82"] # FAN1-FAN2 FAN CPLD TARGET SPEED REGISTER + +IPMI_SET_FAN_LED_CMD = "0x39 0x02 {} {}" # IPMI_OEM_NETFN + 0x39 0x02 + fan led id: 4-0x0a + fan color: 0-2 +IPMI_GET_FAN_LED_CMD = "0x39 0x01 {}" # IPMI_OEM_NETFN + 0x39 0x01 + fan led id: 4-0x0a + +IPMI_GET_PSU1_FAN_SPEED_CMD = "0x3e 0x06 0xb0 2 0x90" +IPMI_GET_PSU2_FAN_SPEED_CMD = "0x3e 0x06 0xb2 2 0x90" + +IPMI_SET_PWM = "0x26 0x02 {} {}" +IPMI_FRU_PRINT_ID = "ipmitool fru print {}" +IPMI_SENSOR_LIST_CMD = "ipmitool sensor" +IPMI_FRU_MODEL_KEY = "Board Part Number" +IPMI_FRU_SERIAL_KEY = "Board Serial" + +MAX_OUTLET = 30200 +MAX_INLET = 32000 +SPEED_TOLERANCE = 10 + +# IPMT_OEM_NETFN + 0x3E + {bus} + {8 bit address} + {read count} + 0x3B:PSU FAN SPEED REG +IPMI_PSU_TARGET_SPEED_CMD = "0x3E {} {} 1 0x3B" +PSU_I2C_BUS = "0x06" +PSU_I2C_ADDR = ["0xB0", "0xB2"] # PSU1 and PSU2 I2C ADDR +PSU_FAN = "PSU{}_Fan" +PSU_MAX_RPM = 26500 + +FAN_FRONT = "Fan{}_Front" +FAN_REAR = "Fan{}_Rear" + +FAN_LED_OFF_CMD = "0x00" +FAN_LED_GREEN_CMD = "0x01" +FAN_LED_RED_CMD = "0x02" +FAN1_LED_CMD = "0x04" + +FAN1_FRU_ID = 6 # silverstoneX has no FAN FRU + + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): + self.fan_index = fan_index + self.fan_tray_index = fan_tray_index + self.is_psu_fan = is_psu_fan + if self.is_psu_fan: + self.psu_index = psu_index + self._api_helper = APIHelper() + self.index = self.fan_tray_index * 2 + self.fan_index + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + direction = self.FAN_DIRECTION_EXHAUST + status, raw_flow = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_AIR_FLOW_CMD.format(hex(self.fan_tray_index))) + if status and raw_flow == "01": + direction = self.FAN_DIRECTION_INTAKE + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + if self.is_psu_fan: + max_rpm = PSU_MAX_RPM + if self.psu_index % 2 == 0: + status, raw_ss_read = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_GET_PSU1_FAN_SPEED_CMD) + else: + status, raw_ss_read = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_GET_PSU2_FAN_SPEED_CMD) + + raw_ss_read_reverse = raw_ss_read.split()[::-1] + data_high = ('{0:0{1}b}'.format(int(raw_ss_read_reverse[0], 16), len(raw_ss_read_reverse[0]) * 4)) + n_bin = data_high[:5] + n = int(n_bin, 2) + data_low = ('{0:0{1}b}'.format(int(raw_ss_read_reverse[1], 16), len((raw_ss_read_reverse[0]) * 4))) + y_bin = data_high[-3:] + data_low + y = int(y_bin, 2) + rpm_speed = float(y * 2 ** n) + speed = int(rpm_speed / max_rpm * 100) + else: + max_rpm = MAX_OUTLET if self.fan_index % 2 == 0 else MAX_INLET + status, raw_ss_read = self._api_helper.ipmi_raw(IPMI_OEM_NETFN, IPMI_FAN_SPEED_CMD.format(hex(self.fan_tray_index))) + if self.fan_index % 2 == 0: # Front Speed + ss_read = raw_ss_read.split()[0] + else: + ss_read = raw_ss_read.split()[1] # Rear Speed + rpm_speed = int(ss_read, 16)*150 # RPM = ss_read * 150 + speed = int(float(rpm_speed) / max_rpm * 100) + return speed if speed <= 100 else rpm_speed + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + + Note: + speed_pc = pwm_target/255*100 + + 0 : when PWM mode is use + pwm : when pwm mode is not use + """ + if self.is_psu_fan is False: + get_target_speed_cmd = IPMI_FAN_TARGET_SPEED_CMD.format( + FAN_TARGET_SPEED_REG[self.fan_tray_index]) # raw speed: 0-255 + status, get_target_speed_res = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, get_target_speed_cmd) + target = int(round(float(int(get_target_speed_res, 16)) * 100 / 255)) + else: + # PSU fan speed can be set and read, but it's not used for FCS by BMC in SilverstoneX, so value in PSU 0x3B register is random and it's meaningless to read back + # get_target_speed_cmd = IPMI_PSU_TARGET_SPEED_CMD.format(PSU_I2C_BUS, + # PSU_I2C_ADDR[self.psu_index]) # raw speed: 0-100 + # status, get_target_speed_res = self._api_helper.ipmi_raw( + # IPMI_OEM_NETFN, get_target_speed_cmd) + # target = int(get_target_speed_res, 16) + target = "N/A" + return target + + 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 + """ + return SPEED_TOLERANCE + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 20 (min speed) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + Notes: + pwm setting mode must set as Manual + manual: ipmitool raw 0x3a 0x26 0x01 0x0 + auto: ipmitool raw 0x3a 0x26 0x01 0x1 + """ + # Force minimun speed as 20% as BMC suggests + if float(speed) < 20: + speed = 20 + fan_register_hex = hex(self.fan_tray_index) + set_speed_cmd = IPMI_SET_PWM.format(fan_register_hex, speed) + status, set_speed_res = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, set_speed_cmd) + return False if not status else True + # return False # not to set fan speed if BMC exists + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + + Note: + LED setting mode must set as Manual operation mode first when BMC exsits + manual: ipmitool raw 0x3A 0x42 0x02 0x00 + auto: ipmitool raw 0x3A 0x42 0x02 0x01 + """ + led_cmd = { + self.STATUS_LED_COLOR_GREEN: FAN_LED_GREEN_CMD, + self.STATUS_LED_COLOR_RED: FAN_LED_RED_CMD, + self.STATUS_LED_COLOR_OFF: FAN_LED_OFF_CMD + }.get(color) + + fan_selector = hex(int(FAN1_LED_CMD, 16) + self.fan_tray_index) + status, set_led = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_SET_FAN_LED_CMD.format(fan_selector, led_cmd)) + set_status_led = False if not status else True + + return set_status_led + + def get_status_led(self): + """ + Gets the state of the fan status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + + Note: + STATUS_LED_COLOR_GREEN = "green" + STATUS_LED_COLOR_AMBER = "amber" + STATUS_LED_COLOR_RED = "red" + STATUS_LED_COLOR_OFF = "off" + """ + fan_selector = hex(int(FAN1_LED_CMD, 16) + self.fan_tray_index) + status, hx_color = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_GET_FAN_LED_CMD.format(fan_selector)) + + status_led = { + "00": self.STATUS_LED_COLOR_OFF, + "01": self.STATUS_LED_COLOR_GREEN, + "02": self.STATUS_LED_COLOR_RED, + }.get(hx_color, "Unknown") + + return status_led + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[ + self.fan_tray_index * 2 + self.fan_index] if not self.is_psu_fan else "PSU-{} FAN-{}".format( + self.psu_index + 1, self.fan_index + 1) + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + presence = False + status, raw_present = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_FAN_PRESENT_CMD.format(hex(self.index / 2))) + + if status and raw_present == "00": + presence = True + + return presence + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + model = "Unknown" + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial = "Unknown" + # ipmi_fru_idx = self.fan_tray_index + FAN1_FRU_ID + # status, raw_model = self._api_helper.ipmi_fru_id( + # ipmi_fru_idx, IPMI_FRU_SERIAL_KEY) + + # fru_sr_list = raw_model.split() + # if len(fru_sr_list) > 3: + # serial = fru_sr_list[3] + + return serial + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() and self.get_speed() > 0 + diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/helper.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/helper.py new file mode 100644 index 00000000000..5198efbb5ba --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/helper.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python + +import os +import struct +import subprocess +from sonic_py_common import device_info +from mmap import * + +HOST_CHK_CMD = "docker > /dev/null 2>&1" +EMPTY_STRING = "" + + +class APIHelper(): + + def __init__(self): + (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() + + def is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def pci_get_value(self, resource, offset): + status = True + result = "" + try: + fd = os.open(resource, os.O_RDWR) + mm = mmap(fd, 0) + mm.seek(int(offset)) + read_data_stream = mm.read(4) + result = struct.unpack('I', read_data_stream) + except Exception: + status = False + return status, result + + def run_command(self, cmd): + status = True + result = "" + try: + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + except Exception: + status = False + return status, result + + def run_interactive_command(self, cmd): + try: + os.system(cmd) + except Exception: + return False + return True + + def read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def read_one_line_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.readline() + return data.strip() + except IOError: + pass + return None + + def write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except Exception as E: + print(str(E)) + return False + return True + + def get_cpld_reg_value(self, getreg_path, register): + cmd = "echo {1} > {0}; cat {0}".format(getreg_path, register) + status, result = self.run_command(cmd) + return result if status else None + + def ipmi_raw(self, netfn, cmd): + status = True + result = "" + try: + cmd = "ipmitool raw {} {}".format(str(netfn), str(cmd)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_fru_id(self, id, key=None): + status = True + result = "" + try: + cmd = "ipmitool fru print {}".format(str( + id)) if not key else "ipmitool fru print {0} | grep '{1}' ".format(str(id), str(key)) + + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result + + def ipmi_set_ss_thres(self, id, threshold_key, value): + status = True + result = "" + try: + cmd = "ipmitool sensor thresh '{}' {} {}".format( + str(id), str(threshold_key), str(value)) + p = subprocess.Popen( + cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + raw_data, err = p.communicate() + if err == '': + result = raw_data.strip() + else: + status = False + except Exception: + status = False + return status, result diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/platform.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/platform.py new file mode 100644 index 00000000000..a632de87e74 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/platform.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# 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): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/psu.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/psu.py new file mode 100644 index 00000000000..9a2362ded01 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/psu.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# +import subprocess +import sys +import re +import math + +try: + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.fan import Fan + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] +PSU_NUM_FAN = [7, 8] +PSU_I2C_MAPPING = { + 0: { + "num": 10, + "addr": "5a" + }, + 1: { + "num": 11, + "addr": "5b" + }, +} +IPMI_OEM_NETFN = "0x39" +IPMI_SENSOR_NETFN = "0x04" +IPMI_SS_READ_CMD = "0x2D {}" +IPMI_SET_PSU_LED_CMD = "0x02 0x02 {}" +IPMI_GET_PSU_LED_CMD = "0x01 0x02" +IPMI_FRU_PRINT_ID = "ipmitool fru print {}" +IPMI_FRU_MODEL_KEY = "Product Part Number" +IPMI_FRU_SERIAL_KEY = "Product Serial " + +PSU_LED_OFF_CMD = "0x00" +PSU_LED_GREEN_CMD = "0x01" +PSU_LED_AMBER_CMD = "0x02" + +PSU1_VOUT_SS_ID = "0x2e" +PSU1_COUT_SS_ID = "0x2f" +PSU1_POUT_SS_ID = "0x30" +PSU1_STATUS_REG = "0x3a" +PSU1_TMP1_REG = "0x2c" +PSU1_TMP2_REG = "0x2d" +PSU1_TMP3_REG = "0x6a" + +PSU2_VOUT_SS_ID = "0x37" +PSU2_COUT_SS_ID = "0x38" +PSU2_POUT_SS_ID = "0x39" +PSU2_STATUS_REG = "0x3b" +PSU2_TMP1_REG = "0x35" +PSU2_TMP2_REG = "0x36" +PSU2_TMP3_REG = "0x6b" + +PSU1_FRU_ID = 3 + +SS_READ_OFFSET = 0 +PSU_MAX_POWER = 1500 + + +class Psu(PsuBase): + """Platform-specific Psu class""" + + def __init__(self, psu_index): + PsuBase.__init__(self) + self.index = psu_index + self._api_helper = APIHelper() + + self.ipmi_raw = "ipmitool raw 0x4 0x2d" + + self.psu1_id = "0x3a" + self.psu2_id = "0x3b" + fan_index = PSU_NUM_FAN[self.index] + fan = Fan(fan_index, 0, is_psu_fan=True, psu_index=self.index) + self._fan_list.append(fan) + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + psu_vout_key = globals()['PSU{}_VOUT_SS_ID'.format(self.index + 1)] + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_vout_key)) + ss_read = raw_ss_read.split()[SS_READ_OFFSET] + # Formula: Rx1x10^-1 + psu_voltage = int(ss_read, 16) * math.pow(10, -1) + + return psu_voltage + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + psu_cout_key = globals()['PSU{}_COUT_SS_ID'.format(self.index + 1)] + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_cout_key)) + ss_read = raw_ss_read.split()[SS_READ_OFFSET] + # Formula: Rx5x10^-1 + psu_current = int(ss_read, 16) * 5 * math.pow(10, -1) + + return psu_current + + @staticmethod + def get_maximum_supplied_power(): + return 1500.0 + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + psu_pout_key = globals()['PSU{}_POUT_SS_ID'.format(self.index + 1)] + status, raw_ss_read = self._api_helper.ipmi_raw( + IPMI_SENSOR_NETFN, IPMI_SS_READ_CMD.format(psu_pout_key)) + ss_read = raw_ss_read.split()[SS_READ_OFFSET] + # Formula: Rx6x10^0 + psu_power = int(ss_read, 16) * 6 + return float(psu_power) + + @staticmethod + def get_voltage_high_threshold(): + return 14.0 + + @staticmethod + def get_voltage_low_threshold(): + return 11.0 + + 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. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + Note + Set manual + ipmitool raw 0x3a 0x42 0x2 0x00 + """ + led_cmd = { + self.STATUS_LED_COLOR_GREEN: PSU_LED_GREEN_CMD, + self.STATUS_LED_COLOR_AMBER: PSU_LED_AMBER_CMD, + self.STATUS_LED_COLOR_OFF: PSU_LED_OFF_CMD + }.get(color) + status, set_led = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_SET_PSU_LED_CMD.format(led_cmd)) + set_status_led = False if not status else True + + return set_status_led + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status, hx_color = self._api_helper.ipmi_raw( + IPMI_OEM_NETFN, IPMI_GET_PSU_LED_CMD) + + status_led = { + "00": self.STATUS_LED_COLOR_OFF, + "01": self.STATUS_LED_COLOR_GREEN, + "02": self.STATUS_LED_COLOR_AMBER, + }.get(hx_color, self.STATUS_LED_COLOR_OFF) + + return status_led + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + @staticmethod + def run_command(command): + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + (out, err) = proc.communicate() + + if proc.returncode != 0: + sys.exit(proc.returncode) + return out + + @staticmethod + def find_value(in_string): + result = re.search("^.+ ([0-9a-f]{2}) .+$", in_string) + if result: + return result.group(1) + else: + return result + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + if self.index is None: + return False + + psu_id = self.psu1_id if self.index == 1 else self.psu2_id + res_string = self.run_command(self.ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + presence = (int(status_byte, 16) >> 0) & 1 + if presence: + return True + else: + return False + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if self.index is None: + return False + + psu_id = self.psu1_id if self.index == 0 else self.psu2_id + res_string = self.run_command(self.ipmi_raw + ' ' + psu_id) + status_byte = self.find_value(res_string) + + if status_byte is None: + return False + + failure_detected = (int(status_byte, 16) >> 1) & 1 + input_lost = (int(status_byte, 16) >> 3) & 1 + if failure_detected or input_lost: + return False + else: + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + eg.ipmitool fru print 4 + Product Manufacturer : DELTA + Product Name : DPS-1300AB-6 J + Product Part Number : DPS-1300AB-6 J + Product Version : S1F + Product Serial : JDMD2111000125 + Product Asset Tag : S1F + """ + model = "Unknown" + ipmi_fru_idx = self.index + PSU1_FRU_ID + status, raw_model = self._api_helper.ipmi_fru_id( + ipmi_fru_idx, IPMI_FRU_MODEL_KEY) + + fru_pn_list = raw_model.split() + if len(fru_pn_list) > 4: + model = fru_pn_list[4] + + return model + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + serial = "Unknown" + ipmi_fru_idx = self.index + PSU1_FRU_ID + status, raw_model = self._api_helper.ipmi_fru_id( + ipmi_fru_idx, IPMI_FRU_SERIAL_KEY) + + fru_sr_list = raw_model.split() + if len(fru_sr_list) > 3: + serial = fru_sr_list[3] + + return serial diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/sensors.conf b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/sensors.conf new file mode 100644 index 00000000000..24e7caaf080 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/sensors.conf @@ -0,0 +1,24 @@ +# libsensors configuration file for Celestica SilversoneX None BMC. +# The i2c bus portion is omit because adapter name +# changes every time when system boot up. + +chip "CPU" + label temp1 "CPU_TEMP" + set temp1_max 70 + +chip "lm75b-i2c-*-0x9a Dev_Addr(8)" + label temp1 "TEMP_BB_U3" + set temp1_max 70 + +chip "lm75b-i2c-*-0x94 Dev_Addr(8)" + label temp1 "TEMP_SW_U25" + set temp1_max 70 + +chip "lm75b-i2c-*-0x92 Dev_Addr(8)" + label temp1 "TEMP_SW_U16" + set temp1_max 70 + +chip "lm75b-i2c-*-0x90 Dev_Addr(8)" + label temp1 "TEMP_SW_U52" + set temp1_max 70 + diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/sfp.py new file mode 100644 index 00000000000..327076bd832 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/sfp.py @@ -0,0 +1,1880 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +# +############################################################################# + +import time +from ctypes import create_string_buffer + +try: + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId + from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom + from sonic_platform_base.sonic_sfp.sfputilhelper import SfpUtilHelper + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +INFO_OFFSET = 128 +DOM_OFFSET = 0 + +# definitions of the offset and width for values in XCVR info eeprom +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_QSFP = 20 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_TYPE_OFFSET = 0 +XCVR_TYPE_WIDTH = 1 +XCVR_EXT_TYPE_OFFSET = 1 +XCVR_EXT_TYPE_WIDTH = 1 +XCVR_CONNECTOR_OFFSET = 2 +XCVR_CONNECTOR_WIDTH = 1 +XCVR_COMPLIANCE_CODE_OFFSET = 3 +XCVR_COMPLIANCE_CODE_WIDTH = 8 +XCVR_ENCODING_OFFSET = 11 +XCVR_ENCODING_WIDTH = 1 +XCVR_NBR_OFFSET = 12 +XCVR_NBR_WIDTH = 1 +XCVR_EXT_RATE_SEL_OFFSET = 13 +XCVR_EXT_RATE_SEL_WIDTH = 1 +XCVR_CABLE_LENGTH_OFFSET = 14 +XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_CABLE_LENGTH_WIDTH_SFP = 6 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_HW_REV_WIDTH_SFP = 4 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 2 + +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 + +# definitions of the offset for values in OSFP info eeprom, base on CMIS Rev4.0 released on May 8, 2019 +PAGE_SELETCT_OFFSET = 127 +OSFP_INFO_PAGE = 0 +OSFP_TYPE_OFFSET = 128 +OSFP_VENDOR_NAME_OFFSET = 129 +OSFP_VENDOR_PN_OFFSET = 148 +OSFP_HW_REV_OFFSET = 164 +OSFP_VENDOR_SN_OFFSET = 166 +OSFP_VENDOR_OUI_OFFSET = 145 +OSFP_VENDOR_DATE_OFFSET = 182 +OSFP_CONNECTOR_OFFSET = 203 +# OSFP_EXT_IDEN_OFFSET = # QSFP-DD has no extended identifier +OSFP_CABLE_LENGTH_OFFSET = 202 +OSFP_CABLE_LENGTH_WIDTH = 1 +OSFP_MEDIA_TYPE_OFFSET = 85 +OSFP_MEDIA_TYPE_WIDTH = 1 + +OSFP_TEMPERATURE_OFFSET = 9 +OSFP_TEMPER_MSB_OFFSET = 14 +OSFP_TEMPER_LSB_OFFSET = 15 +OSFP_TEMPE_WIDTH = 2 + +OSFP_SUPPLY_VOL_MSB_OFFSET = 16 +OSFP_SUPPLY_VOL_LSB_OFFSET = 17 +OSFP_SUPPLY_VOL_WIDTH = 2 + +OSFP_DOM_PAGE = 0x11 +OSFP_DOM_CAPABILITY_OFFSET = 154 # page 11h, byte 154-201, 48 bytes, spec page 141 +OSFP_DOM_TX_POWER_OFFSET = 154 # page 11h, byte 154-169, 16 bytes +OSFP_DOM_TX_POWER_WIDTH = 16 +OSFP_DOM_RX_POWER_OFFSET = 186 # page 11h, byte 186-201, 16 bytes +OSFP_DOM_RX_POWER_WIDTH = 16 +OSFP_DOM_TX_BIAS_OFFSET = 170 # page 11h, byte 170-185, 16 bytes +OSFP_DOM_TX_BIAS_WIDTH = 16 + +OSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 135 # page 11h, bit0-lane1, bit7-lane8, spec page 63/137 +OSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +OSFP_CHANNL_TX_LOS_STATUS_OFFSET = 136 # page 11h, bit0-lane1, bit7-lane8 +OSFP_CHANNL_TX_LOS_STATUS_WIDTH = 1 +OSFP_CHANNL_RX_LOS_STATUS_OFFSET = 147 # page 11h, bit0-lane1, bit7-lane8 +OSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 + +OSFP_LANE_SPECIFIC_CTRL_PAGE = 0x10 +OSFP_CHANNL_DISABLE_STATUS_OFFSET = 130 # page 10h, byte 130, bit0-lane1, bit7-lane8, spec page 120 +OSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 + +OSFP_CHANNL_DISABLE_CTR_LANS = 151 # page 01h, byte 151 bit0(0-per lane, 1-all lanes) +OSFP_CHANNL_DISABLE_COMPLMT = 155 # page 01h, byte 155 bit1(0-not complemented, 1-complemented) + +# Module Global Controls -- page 0, Lane-specific controls are located in Upper page 10h like disable channels +OSFP_GLOBAL_CTRL_PAGE = 0x00 +OSFP_POWEROVERRIDE_OFFSET = 26 +OSFP_POWEROVERRIDE_WIDTH = 1 +OSFP_POWEROVERRIDE_BIT = 4 +OSFP_POWERSET_BIT = 6 + +OSFP_MODULE_THRESHOLD_PAGE = 0x02 +OSFP_MODULE_THRESHOLD_OFFSET = 128 +OSFP_MODULE_THRESHOLD_WIDTH = 72 + +# Offset for values in QSFP eeprom +QSFP_DOM_REV_OFFSET = 1 +QSFP_DOM_REV_WIDTH = 1 +QSFP_RESET_STATUS_OFFSET = 6 +QSFP_RESET_STATUS_WIDTH = 1 +QSFP_TEMPE_OFFSET = 22 +QSFP_TEMPE_WIDTH = 2 +QSFP_VOLT_OFFSET = 26 +QSFP_VOLT_WIDTH = 2 +QSFP_VERSION_COMPLIANCE_OFFSET = 1 +QSFP_VERSION_COMPLIANCE_WIDTH = 2 +QSFP_CHANNL_MON_OFFSET = 34 +QSFP_CHANNL_MON_WIDTH = 16 +QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 +QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 +QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 +QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_MODULE_MONITOR_OFFSET = 0 +QSFP_MODULE_MONITOR_WIDTH = 9 +QSFP_POWEROVERRIDE_OFFSET = 93 +QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_POWEROVERRIDE_BIT = 0 +QSFP_POWERSET_BIT = 1 +QSFP_OPTION_VALUE_OFFSET = 192 +QSFP_OPTION_VALUE_WIDTH = 4 +QSFP_MODULE_UPPER_PAGE3_START = 384 +QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_WIDTH = 24 +QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_WIDTH = 24 + +SFP_MODULE_ADDRA2_OFFSET = 256 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 56 +SFP_CHANNL_THRESHOLD_OFFSET = 112 +SFP_CHANNL_THRESHOLD_WIDTH = 2 + +SFP_TEMPE_OFFSET = 96 +SFP_TEMPE_WIDTH = 2 +SFP_VOLT_OFFSET = 98 +SFP_VOLT_WIDTH = 2 +SFP_CHANNL_MON_OFFSET = 100 +SFP_CHANNL_MON_WIDTH = 6 +SFP_CHANNL_STATUS_OFFSET = 110 +SFP_CHANNL_STATUS_WIDTH = 1 + +qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', + 'Length OM2(m)', 'Length OM1(m)', + 'Length Cable Assembly(m)') + +sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + +sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes', 'FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia', 'FibreChannelSpeed') + +qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', + 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', + 'Fibre Channel transmission media', 'Fibre Channel Speed') + +SFP_TYPE = "SFP" +QSFP_TYPE = "QSFP" +OSFP_TYPE = "OSFP" + +PORT_START = 1 +PORT_END = 34 +OSFP_PORT_START = 1 +OSFP_PORT_END = 32 +SFP_PORT_START = 33 +SFP_PORT_END = 34 + +SFP_I2C_START = 12 + + +class Sfp(SfpBase): + """Platform-specific Sfp class""" + + # Path to OSFP sysfs + RESET_PATH = "/sys/class/SFF/QSFP{0}/qsfp_reset" + LP_PATH = "/sys/class/SFF/QSFP{0}/qsfp_lpmode" + OSFP_PRS_PATH = "/sys/class/SFF/QSFP{0}/qsfp_modprs" + SFP_PRS_PATH = "/sys/devices/platform/fpga-xcvr/SFP{0}/sfp_modabs" + PLATFORM_ROOT_PATH = "/usr/share/sonic/device" + PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" + + def __init__(self, sfp_index): + SfpBase.__init__(self) + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + self.dom_supported = False + self.sfp_type, self.port_name = self.__get_sfp_info() + self._api_helper = APIHelper() + self.platform = self._api_helper.platform + self.hwsku = self._api_helper.hwsku + + # Init eeprom path + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + self.port_to_eeprom_mapping = {} + self.port_to_i2c_mapping = {} + + for x in range(PORT_START, PORT_END + 1): + self.port_to_i2c_mapping[x] = (SFP_I2C_START - PORT_START + x) + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + + self.info_dict_keys = ['type', 'type_abbrv_name', 'hardware_rev', 'serial', 'manufacturer', 'model', + 'connector', 'encoding', 'ext_identifier', + 'ext_rateselect_compliance', 'cable_type', 'cable_length', 'nominal_bit_rate', + 'specification_compliance', 'vendor_date', 'vendor_oui'] + + self.dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', 'power_lpmode', 'tx_disable', 'tx_disabled_channel', + 'temperature', 'voltage', + 'rx1power', 'rx2power', 'rx3power', 'rx4power', 'tx1bias', 'tx2bias', 'tx3bias', + 'tx4bias', 'tx1power', 'tx2power', 'tx3power', 'tx4power'] + + self.threshold_dict_keys = ['temphighalarm', 'temphighwarning', 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', 'txpowerhighalarm', 'txpowerhighwarning', + 'txpowerlowalarm', 'txpowerlowwarning', 'txbiashighalarm', 'txbiashighwarning', + 'txbiaslowalarm', 'txbiaslowwarning'] + + self._dom_capability_detect() + + def __get_sfp_info(self): + port_name = "Unknown" + sfp_type = "Unknown" + + if OSFP_PORT_START <= self.port_num <= OSFP_PORT_END: + sfp_type = OSFP_TYPE + port_name = "QSFP" + str(self.port_num) + elif SFP_PORT_START <= self.port_num <= SFP_PORT_END: + sfp_type = SFP_TYPE + port_name = "SFP" + str(self.port_num - SFP_PORT_START + 1) + return sfp_type, port_name + + @staticmethod + def __convert_string_to_num(value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + def __get_path_to_port_config_file(self): + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.platform]) + hwsku_path = "/".join([platform_path, self.hwsku] + ) if self._api_helper.is_host() else self.PMON_HWSKU_PATH + return "/".join([hwsku_path, "port_config.ini"]) + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + for n in range(0, num_bytes): + # To suit parse function in sffbase.py, change hex 1 to strings "31" + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except Exception: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def __write_eeprom_specific_bytes(self, offset, write_bytes): + """ + Writes bytes to sfp eeprom + Args: + offset: integer, 0-0xff + bytes : list, [0x12, 0x13, ...], bytes to write + Returns: + A boolean, True if bytes are written successfully, False if not + """ + + sysfsfile_eeprom = None + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) + + sysfsfile_eeprom.seek(offset) + for i in range(len(write_bytes)): + sysfsfile_eeprom.write(chr(write_bytes[i])) + except Exception as error: + print(str(error)) + return False + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + def __switch_to_page(self, page): + self.__write_eeprom_specific_bytes(PAGE_SELETCT_OFFSET, [page]) + sfp_page_raw = self.__read_eeprom_specific_bytes(PAGE_SELETCT_OFFSET, 1) + if sfp_page_raw is not None: + sfp_page = int(sfp_page_raw[0], 16) + return sfp_page == page + else: + return False + + def _dom_capability_detect(self): + if not self.get_presence(): + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + return + + if self.sfp_type == "QSFP": + self.calibration = 1 + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + offset = INFO_OFFSET + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + (offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qsfp_version_compliance_raw = self.__read_eeprom_specific_bytes( + QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) + qsfp_version_compliance = int( + qsfp_version_compliance_raw[0], 16) + dom_capability = sfpi_obj.parse_qsfp_dom_capability( + qsfp_dom_capability_raw, 0) + if qsfp_version_compliance >= 0x08: + self.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' + self.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' + else: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = True + + self.dom_supported = True + self.calibration = 1 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + qsfp_option_value_raw = self.__read_eeprom_specific_bytes( + QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) + if qsfp_option_value_raw is not None: + optional_capability = sfpd_obj.parse_option_params( + qsfp_option_value_raw, 0) + self.dom_tx_disable_supported = optional_capability[ + 'data']['TxDisable']['value'] == 'On' + dom_status_indicator = sfpd_obj.parse_dom_status_indicator( + qsfp_version_compliance_raw, 1) + self.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.qsfp_page3_available = False + + elif self.sfp_type == "SFP": + sfpi_obj = sff8472InterfaceId() + if sfpi_obj is None: + return None + sfp_dom_capability_raw = self.__read_eeprom_specific_bytes( + XCVR_DOM_CAPABILITY_OFFSET, XCVR_DOM_CAPABILITY_WIDTH) + if sfp_dom_capability_raw is not None: + sfp_dom_capability = int(sfp_dom_capability_raw[0], 16) + self.dom_supported = (sfp_dom_capability & 0x40 != 0) + if self.dom_supported: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = True + self.dom_tx_power_supported = True + if sfp_dom_capability & 0x20 != 0: + self.calibration = 1 + elif sfp_dom_capability & 0x10 != 0: + self.calibration = 2 + else: + self.calibration = 0 + else: + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.dom_tx_disable_supported = ( + int(sfp_dom_capability_raw[1], 16) & 0x40 != 0) + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + nominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + ======================================================================== + """ + compliance_code_dict = {} + transceiver_info_dict = dict.fromkeys(self.info_dict_keys, 'N/A') + if not self.get_presence(): + return transceiver_info_dict + + # ToDo: OSFP tranceiver info parsing not fully supported. + # in inf8628.py lack of some memory map definition + # will be implemented when the inf8628 memory map ready + if self.sfp_type == OSFP_TYPE: + offset = 0 + vendor_rev_width = XCVR_HW_REV_WIDTH_OSFP + # eeprom switch to page 0 + if not self.__switch_to_page(OSFP_INFO_PAGE): + return transceiver_info_dict + + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + return None + + # Read raw data in upper page + sfp_info_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_TYPE_OFFSET), 128) + if sfp_info_raw is None: + return None + + start = OSFP_TYPE_OFFSET - OSFP_TYPE_OFFSET + end = start + XCVR_TYPE_WIDTH + sfp_type_data = sfpi_obj.parse_sfp_type(sfp_info_raw[start: end], 0) + + start = OSFP_VENDOR_NAME_OFFSET - OSFP_TYPE_OFFSET + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_info_raw[start: end], 0) + + start = OSFP_VENDOR_PN_OFFSET - OSFP_TYPE_OFFSET + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_info_raw[start: end], 0) + + start = OSFP_HW_REV_OFFSET - OSFP_TYPE_OFFSET + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_info_raw[start: end], 0) + + start = OSFP_VENDOR_SN_OFFSET - OSFP_TYPE_OFFSET + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_info_raw[start: end], 0) + + start = OSFP_VENDOR_OUI_OFFSET - OSFP_TYPE_OFFSET + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_info_raw[start: end], 0) + + start = OSFP_VENDOR_DATE_OFFSET - OSFP_TYPE_OFFSET + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_info_raw[start: end], 0) + + start = OSFP_CABLE_LENGTH_OFFSET - OSFP_TYPE_OFFSET + end = start + OSFP_CABLE_LENGTH_WIDTH + sfp_cable_len_data = sfpi_obj.parse_cable_len(sfp_info_raw[start: end], 0) + + start = OSFP_CONNECTOR_OFFSET - OSFP_TYPE_OFFSET + end = start + XCVR_CONNECTOR_WIDTH + sfp_connector_data = sfpi_obj.parse_connector(sfp_info_raw[start: end], 0) + + # This field is not required in 201911 branch and not support parse in qsfp-dd.py + # sfp_media_type_raw = self.__read_eeprom_specific_bytes( + # (offset + OSFP_MEDIA_TYPE_OFFSET), OSFP_MEDIA_TYPE_WIDTH) + # if sfp_media_type_raw is not None: + # sfp_media_type_data = sfpi_obj.parse_media(sfp_media_type_raw, 0) + # else: + # return None + + transceiver_info_dict['type'] = sfp_type_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ + 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + transceiver_info_dict['connector'] = sfp_connector_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = 'N/A' + transceiver_info_dict['ext_identifier'] = 'N/A' + transceiver_info_dict['ext_rateselect_compliance'] = 'N/A' + transceiver_info_dict['cable_type'] = 'N/A' + transceiver_info_dict['cable_length'] = str(sfp_cable_len_data[ + 'data']['Length Cable Assembly(m)']['value']) + transceiver_info_dict['specification_compliance'] = '{}' + transceiver_info_dict['nominal_bit_rate'] = 'N/A' + + else: + if self.sfp_type == QSFP_TYPE: + offset = INFO_OFFSET + vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP + # cable_length_width = XCVR_CABLE_LENGTH_WIDTH_QSFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP + + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + else: + offset = 0 + vendor_rev_width = XCVR_HW_REV_WIDTH_SFP + # cable_length_width = XCVR_CABLE_LENGTH_WIDTH_SFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_SFP + + sfpi_obj = sff8472InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + sfp_interface_bulk_raw = self.__read_eeprom_specific_bytes( + offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: + return None + + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui( + sfp_interface_bulk_raw[start: end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date( + sfp_interface_bulk_raw[start: end], 0) + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data[ + 'data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier'][ + 'value'] + + if self.sfp_type == QSFP_TYPE: + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = \ + sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + else: + for key in sfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str( + sfp_interface_bulk_data['data'][key]['value']) + + for key in sfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = \ + sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + + transceiver_info_dict['nominal_bit_rate'] = str( + sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value']) + + if "QSFP-DD" in transceiver_info_dict['type']: + transceiver_info_dict['type_abbrv_name'] = "QSFP-DD" + elif "SFP" in transceiver_info_dict['type']: + transceiver_info_dict['type_abbrv_name'] = "SFP" + else: + transceiver_info_dict['type_abbrv_name'] = "N/A" + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + rx_los |BOOLEAN |RX loss-of-signal status, True if has RX los, False if not. + tx_fault |BOOLEAN |TX fault status, True if has TX fault, False if not. + reset_status |BOOLEAN |reset status, True if SFP in reset, False if not. + lp_mode |BOOLEAN |low power mode status, True in lp mode, False if not. + tx_disable |BOOLEAN |TX disable status, True TX disabled, False if not. + tx_disabled_channel |HEX |disabled TX channels in hex, bits 0 to 3 represent channel 0 + | |to channel 3. + temperature |INT |module temperature in Celsius + voltage |INT |supply voltage in mV + txbias |INT |TX Bias Current in mA, n is the channel number, + | |for example, tx2bias stands for tx bias of channel 2. + rxpower |INT |received optical power in mW, n is the channel number, + | |for example, rx2power stands for rx power of channel 2. + txpower |INT |TX output power in mW, n is the channel number, + | |for example, tx2power stands for tx power of channel 2. + ======================================================================== + """ + transceiver_dom_info_dict = dict.fromkeys(self.dom_dict_keys, 'N/A') + + if self.sfp_type == OSFP_TYPE: + offset = 0 + sfpi_obj = qsfp_dd_Dom() + if sfpi_obj is None: + return None + + # eeprom switch to page 0x02 + if not self.__switch_to_page(OSFP_INFO_PAGE): + return transceiver_dom_info_dict + + sfp_temperature_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_TEMPER_MSB_OFFSET), OSFP_TEMPE_WIDTH) + if sfp_temperature_raw is not None: + sfp_temperature_data = sfpi_obj.parse_temperature(sfp_temperature_raw, 0) + temp = self.__convert_string_to_num(sfp_temperature_data['data']['Temperature']['value']) + transceiver_dom_info_dict['temperature'] = temp + else: + return None + + sfp_voltage_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_SUPPLY_VOL_MSB_OFFSET), OSFP_SUPPLY_VOL_WIDTH) + if sfp_voltage_raw is not None: + sfp_voltage_data = sfpi_obj.parse_voltage(sfp_voltage_raw, 0) + volt = self.__convert_string_to_num(sfp_voltage_data['data']['Vcc']['value']) + transceiver_dom_info_dict['voltage'] = volt + else: + return None + + # eeprom switch to page 0x11 + if not self.__switch_to_page(OSFP_DOM_PAGE): + return transceiver_dom_info_dict + + sfp_tx_power_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_DOM_TX_POWER_OFFSET), OSFP_DOM_TX_POWER_WIDTH) + if sfp_tx_power_raw is not None: + sfp_tx_power_data = sfpi_obj.parse_dom_tx_power( + sfp_tx_power_raw, 0) + transceiver_dom_info_dict['tx1power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX4Power']['value']) + transceiver_dom_info_dict['tx5power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX5Power']['value']) + transceiver_dom_info_dict['tx6power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX6Power']['value']) + transceiver_dom_info_dict['tx7power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX7Power']['value']) + transceiver_dom_info_dict['tx8power'] = self.__convert_string_to_num( + sfp_tx_power_data['data']['TX8Power']['value']) + else: + return None + + sfp_rx_power_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_DOM_RX_POWER_OFFSET), OSFP_DOM_RX_POWER_WIDTH) + if sfp_rx_power_raw is not None: + sfp_rx_power_data = sfpi_obj.parse_dom_rx_power( + sfp_rx_power_raw, 0) + transceiver_dom_info_dict['rx1power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX4Power']['value']) + transceiver_dom_info_dict['rx5power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX5Power']['value']) + transceiver_dom_info_dict['rx6power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX6Power']['value']) + transceiver_dom_info_dict['rx7power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX7Power']['value']) + transceiver_dom_info_dict['rx8power'] = self.__convert_string_to_num( + sfp_rx_power_data['data']['RX8Power']['value']) + else: + return None + + sfp_tx_bias_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_DOM_TX_BIAS_OFFSET), OSFP_DOM_TX_BIAS_WIDTH) + if sfp_tx_bias_raw is not None: + sfp_tx_bias_data = sfpi_obj.parse_dom_tx_bias( + sfp_tx_bias_raw, 0) + transceiver_dom_info_dict['tx1bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX1Bias']['value']) + transceiver_dom_info_dict['tx2bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX2Bias']['value']) + transceiver_dom_info_dict['tx3bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX3Bias']['value']) + transceiver_dom_info_dict['tx4bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX4Bias']['value']) + transceiver_dom_info_dict['tx5bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX5Bias']['value']) + transceiver_dom_info_dict['tx6bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX6Bias']['value']) + transceiver_dom_info_dict['tx7bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX7Bias']['value']) + transceiver_dom_info_dict['tx8bias'] = self.__convert_string_to_num( + sfp_tx_bias_data['data']['TX8Bias']['value']) + else: + return None + + elif self.sfp_type == QSFP_TYPE: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_temp_supported: + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature( + dom_data_raw[start: end], 0) + temp = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage( + dom_data_raw[start: end], 0) + volt = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power( + dom_data_raw[start: end], 0) + + if self.dom_tx_power_supported: + transceiver_dom_info_dict['tx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX4Power']['value']) + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RX4Power']['value']) + + transceiver_dom_info_dict['tx1bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX1Bias']['value']) + transceiver_dom_info_dict['tx2bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX2Bias']['value']) + transceiver_dom_info_dict['tx3bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX3Bias']['value']) + transceiver_dom_info_dict['tx4bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TX4Bias']['value']) + + else: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 256 + sfpd_obj = sff8472Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + sfpd_obj._calibration_type = self.calibration + + dom_data_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_DOM_BULK_DATA_START), SFP_DOM_BULK_DATA_SIZE) + + start = SFP_TEMPE_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature( + dom_data_raw[start: end], 0) + + start = SFP_VOLT_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage( + dom_data_raw[start: end], 0) + + start = SFP_CHANNL_MON_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_CHANNL_MON_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params( + dom_data_raw[start: end], 0) + + transceiver_dom_info_dict['temperature'] = self.__convert_string_to_num( + dom_temperature_data['data']['Temperature']['value']) + transceiver_dom_info_dict['voltage'] = self.__convert_string_to_num( + dom_voltage_data['data']['Vcc']['value']) + transceiver_dom_info_dict['rx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['RXPower']['value']) + transceiver_dom_info_dict['tx1bias'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TXBias']['value']) + transceiver_dom_info_dict['tx1power'] = self.__convert_string_to_num( + dom_channel_monitor_data['data']['TXPower']['value']) + + rx_los = self.get_rx_los() + tx_fault = self.get_tx_fault() + tx_disable = self.get_tx_disable() + transceiver_dom_info_dict['rx_los'] = any(item for item in rx_los) + transceiver_dom_info_dict['tx_fault'] = any(item for item in tx_fault) + transceiver_dom_info_dict['tx_disable'] = any(item for item in tx_disable) + + transceiver_dom_info_dict['tx_disabled_channel'] = self.get_tx_disable_channel() + transceiver_dom_info_dict['reset_status'] = self.get_reset_status() + transceiver_dom_info_dict['lp_mode'] = self.get_lpmode() + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict = dict.fromkeys( + self.threshold_dict_keys, 'N/A') + + if self.sfp_type == OSFP_TYPE: + offset = 0 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + # eeprom switch to page 2 + if not self.__switch_to_page(OSFP_MODULE_THRESHOLD_PAGE): + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_MODULE_THRESHOLD_OFFSET), OSFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values( + dom_module_threshold_raw, 0) + + # Threshold Data + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = \ + dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning'][ + 'value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning'][ + 'value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning'][ + 'value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = \ + dom_module_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = \ + dom_module_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = \ + dom_module_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = \ + dom_module_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = \ + dom_module_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = \ + dom_module_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['TxBiasLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = \ + dom_module_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = \ + dom_module_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = \ + dom_module_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = \ + dom_module_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = \ + dom_module_threshold_data['data']['TxPowerLowWarning']['value'] + elif self.sfp_type == QSFP_TYPE: + if not self.dom_supported or not self.qsfp_page3_available: + return transceiver_dom_threshold_info_dict + + # Dom Threshold data starts from offset 384 + # Revert offset back to 0 once data is retrieved + offset = QSFP_MODULE_UPPER_PAGE3_START + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values( + dom_module_threshold_raw, 0) + + dom_channel_threshold_raw = self.__read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), + QSFP_CHANNL_THRESHOLD_WIDTH) + if dom_channel_threshold_raw is None: + return transceiver_dom_threshold_info_dict + dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values( + dom_channel_threshold_raw, 0) + + # Threshold Data + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = \ + dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning'][ + 'value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning'][ + 'value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning'][ + 'value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = \ + dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = \ + dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = \ + dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = \ + dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = \ + dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = \ + dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = \ + dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = \ + dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = \ + dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = \ + dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = \ + dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = \ + dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] + + else: + offset = SFP_MODULE_ADDRA2_OFFSET + + if not self.dom_supported: + return transceiver_dom_threshold_info_dict + + sfpd_obj = sff8472Dom(None, self.calibration) + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self.__read_eeprom_specific_bytes((offset + SFP_MODULE_THRESHOLD_OFFSET), + SFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is not None: + dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold( + dom_module_threshold_raw, 0) + else: + return transceiver_dom_threshold_info_dict + + # Threshold Data + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = \ + dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning'][ + 'value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VoltageHighAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VoltageLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data[ + 'data']['VoltageHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = \ + dom_module_threshold_data['data']['VoltageLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['BiasHighAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['BiasLowAlarm'][ + 'value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = \ + dom_module_threshold_data['data']['BiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = \ + dom_module_threshold_data['data']['BiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = \ + dom_module_threshold_data['data']['TXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = \ + dom_module_threshold_data['data']['TXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = \ + dom_module_threshold_data['data']['TXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = \ + dom_module_threshold_data['data']['TXPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = \ + dom_module_threshold_data['data']['RXPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = \ + dom_module_threshold_data['data']['RXPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = \ + dom_module_threshold_data['data']['RXPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = \ + dom_module_threshold_data['data']['RXPowerLowWarning']['value'] + + for key in transceiver_dom_threshold_info_dict: + transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num( + transceiver_dom_threshold_info_dict[key]) + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + + port_reset_path = self.RESET_PATH.format(self.port_num) + reset_status_raw = self._api_helper.read_txt_file(port_reset_path).rstrip() + if not reset_status_raw: + return False + + return reset_status_raw == '0' + + def get_rx_los(self): + """ + Retrieves the RX LOS (loss-of-signal) status of SFP + Returns: + A list of boolean values, representing the RX LOS status + of each available channel, value is True if SFP channel + has RX LOS, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + + rx_los = [False, False, False, False, False, False, False, False] + if self.sfp_type == OSFP_TYPE: + offset = 0 + + # eeprom switch to page 0x11 + if not self.__switch_to_page(OSFP_DOM_PAGE): + return rx_los + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_CHANNL_RX_LOS_STATUS_OFFSET), OSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx1_los = (rx_los_data & 0x01 != 0) + rx2_los = (rx_los_data & 0x02 != 0) + rx3_los = (rx_los_data & 0x04 != 0) + rx4_los = (rx_los_data & 0x08 != 0) + rx5_los = (rx_los_data & 0x10 != 0) + rx6_los = (rx_los_data & 0x20 != 0) + rx7_los = (rx_los_data & 0x40 != 0) + rx8_los = (rx_los_data & 0x80 != 0) + rx_los = [rx1_los, rx2_los, rx3_los, rx4_los, rx5_los, rx6_los, rx7_los, rx8_los] + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx1_los = (rx_los_data & 0x01 != 0) + rx2_los = (rx_los_data & 0x02 != 0) + rx3_los = (rx_los_data & 0x04 != 0) + rx4_los = (rx_los_data & 0x08 != 0) + rx_los = [rx1_los, rx2_los, rx3_los, rx4_los] + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los = [(rx_los_data & 0x02 != 0)] + + return rx_los + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + Returns: + A list of boolean values, representing the TX fault status + of each available channel, value is True if SFP channel + has TX fault, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + + tx_fault = [False, False, False, False, False, False, False, False] + + if self.sfp_type == OSFP_TYPE: + offset = 0 + + # eeprom switch to page 0x11 + if not self.__switch_to_page(OSFP_DOM_PAGE): + return tx_fault + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_CHANNL_TX_FAULT_STATUS_OFFSET), OSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx1_fault = (tx_fault_data & 0x01 != 0) + tx2_fault = (tx_fault_data & 0x02 != 0) + tx3_fault = (tx_fault_data & 0x04 != 0) + tx4_fault = (tx_fault_data & 0x08 != 0) + tx5_fault = (tx_fault_data & 0x10 != 0) + tx6_fault = (tx_fault_data & 0x20 != 0) + tx7_fault = (tx_fault_data & 0x40 != 0) + tx8_fault = (tx_fault_data & 0x80 != 0) + tx_fault = [tx1_fault, tx2_fault, tx3_fault, tx4_fault, tx5_fault, tx6_fault, tx7_fault, tx8_fault] + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx1_fault = (tx_fault_data & 0x01 != 0) + tx2_fault = (tx_fault_data & 0x02 != 0) + tx3_fault = (tx_fault_data & 0x04 != 0) + tx4_fault = (tx_fault_data & 0x08 != 0) + tx_fault = [tx1_fault, tx2_fault, tx3_fault, tx4_fault] + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault = [(tx_fault_data & 0x04 != 0)] + + return tx_fault + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + Returns: + A list of boolean values, representing the TX disable status + of each available channel, value is True if SFP channel + is TX disabled, False if not. + E.g., for a tranceiver with four channels: [False, False, True, False] + """ + + tx_disable = [False, False, False, False, False, False, False, False] + + if self.sfp_type == OSFP_TYPE: + offset = 0 + # eeprom switch to page 0x10 + if not self.__switch_to_page(OSFP_LANE_SPECIFIC_CTRL_PAGE): + return tx_disable + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_CHANNL_DISABLE_STATUS_OFFSET), OSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx1_disable = (tx_disable_data & 0x01 != 0) + tx2_disable = (tx_disable_data & 0x02 != 0) + tx3_disable = (tx_disable_data & 0x04 != 0) + tx4_disable = (tx_disable_data & 0x08 != 0) + tx5_disable = (tx_disable_data & 0x10 != 0) + tx6_disable = (tx_disable_data & 0x20 != 0) + tx7_disable = (tx_disable_data & 0x40 != 0) + tx8_disable = (tx_disable_data & 0x80 != 0) + tx_disable = [tx1_disable, tx2_disable, tx3_disable, tx4_disable, + tx5_disable, tx6_disable, tx7_disable, tx8_disable] + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx1_disable = (tx_disable_data & 0x01 != 0) + tx2_disable = (tx_disable_data & 0x02 != 0) + tx3_disable = (tx_disable_data & 0x04 != 0) + tx4_disable = (tx_disable_data & 0x08 != 0) + tx_disable = [tx1_disable, tx2_disable, tx3_disable, tx4_disable] + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable = [(tx_disable_data & 0xC0 != 0)] + + return tx_disable + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + tx_disable_list = [False, False, False, False, False, False, False, False] + tx_disabled = 0 + + if self.sfp_type == OSFP_TYPE: + offset = 0 + # eeprom switch to page 0x10 + if not self.__switch_to_page(OSFP_LANE_SPECIFIC_CTRL_PAGE): + return tx_disabled + + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + OSFP_CHANNL_DISABLE_STATUS_OFFSET), OSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list[0] = (tx_disable_data & 0x01 != 0) + tx_disable_list[1] = (tx_disable_data & 0x02 != 0) + tx_disable_list[2] = (tx_disable_data & 0x04 != 0) + tx_disable_list[3] = (tx_disable_data & 0x08 != 0) + tx_disable_list[4] = (tx_disable_data & 0x10 != 0) + tx_disable_list[5] = (tx_disable_data & 0x20 != 0) + tx_disable_list[6] = (tx_disable_data & 0x40 != 0) + tx_disable_list[7] = (tx_disable_data & 0x80 != 0) + + elif self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list[0] = (tx_disable_data & 0x01 != 0) + tx_disable_list[1] = (tx_disable_data & 0x02 != 0) + tx_disable_list[2] = (tx_disable_data & 0x04 != 0) + tx_disable_list[3] = (tx_disable_data & 0x08 != 0) + else: + offset = 256 + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + (offset + SFP_CHANNL_STATUS_OFFSET), SFP_CHANNL_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list[0] = (tx_disable_data & 0xC0 != 0) + + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disabled |= 1 << i + return tx_disabled + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + try: + port_lpmode_path = self.LP_PATH.format(self.port_num) + reg_file = open(port_lpmode_path, "r") + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # LPMode is active high + if content == "0": + return False + + return True + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + + if self.sfp_type == OSFP_TYPE: + # eeprom switch to page 0 + if not self.__switch_to_page(OSFP_GLOBAL_CTRL_PAGE): + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + OSFP_POWEROVERRIDE_OFFSET, OSFP_POWEROVERRIDE_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + print("get dom_control_raw is", dom_control_raw) + dom_control_data = int(dom_control_raw[0], 16) + force_lowpwr_bit = dom_control_data & (1 << OSFP_POWEROVERRIDE_BIT) + return force_lowpwr_bit != 0 + + if self.sfp_type == QSFP_TYPE: + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + QSFP_CONTROL_OFFSET, QSFP_CONTROL_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes( + dom_control_raw, 0) + power_override = ( + 'On' == dom_control_data['data']['PowerOverride']['value']) + return power_override + else: + return False + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + Returns: + An integer number of current temperature in Celsius + """ + transceiver_bulk_status = self.get_transceiver_bulk_status() + return transceiver_bulk_status.get("temperature", "N/A") + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + Returns: + An integer number of supply voltage in mV + """ + transceiver_bulk_status = self.get_transceiver_bulk_status() + return transceiver_bulk_status.get("voltage", "N/A") + + def get_tx_bias(self): + """ + Retrieves the TX bias current of all SFP channels + Returns: + A list of floats, representing TX bias in mA + for each available channel + E.g., for a tranceiver with four channels: ['110.09', '111.12', '108.21', '112.09'] + """ + tx_bias_list = [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + if self.sfp_type == OSFP_TYPE: + tx1_bs = transceiver_bulk_status.get("tx1bias", "N/A") + tx2_bs = transceiver_bulk_status.get("tx2bias", "N/A") + tx3_bs = transceiver_bulk_status.get("tx3bias", "N/A") + tx4_bs = transceiver_bulk_status.get("tx4bias", "N/A") + tx5_bs = transceiver_bulk_status.get("tx1bias", "N/A") + tx6_bs = transceiver_bulk_status.get("tx2bias", "N/A") + tx7_bs = transceiver_bulk_status.get("tx3bias", "N/A") + tx8_bs = transceiver_bulk_status.get("tx4bias", "N/A") + tx_bias_list = [tx1_bs, tx2_bs, tx3_bs, tx4_bs, tx5_bs, tx6_bs, tx7_bs, tx8_bs] + elif self.sfp_type == QSFP_TYPE: + tx1_bs = transceiver_bulk_status.get("tx1bias", "N/A") + tx2_bs = transceiver_bulk_status.get("tx2bias", "N/A") + tx3_bs = transceiver_bulk_status.get("tx3bias", "N/A") + tx4_bs = transceiver_bulk_status.get("tx4bias", "N/A") + tx_bias_list = [tx1_bs, tx2_bs, tx3_bs, tx4_bs] + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power of all SFP channels + Returns: + A list of floats, representing received optical + power in mW for each available channel + E.g., for a tranceiver with four channels: ['1.77', '1.71', '1.68', '1.70'] + """ + + rx_power_list = [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + if self.sfp_type == OSFP_TYPE: + rx1_p = transceiver_bulk_status.get("rx1power", "N/A") + rx2_p = transceiver_bulk_status.get("rx2power", "N/A") + rx3_p = transceiver_bulk_status.get("rx3power", "N/A") + rx4_p = transceiver_bulk_status.get("rx4power", "N/A") + rx5_p = transceiver_bulk_status.get("rx5power", "N/A") + rx6_p = transceiver_bulk_status.get("rx6power", "N/A") + rx7_p = transceiver_bulk_status.get("rx7power", "N/A") + rx8_p = transceiver_bulk_status.get("rx8power", "N/A") + rx_power_list = [rx1_p, rx2_p, rx3_p, rx4_p, rx5_p, rx6_p, rx7_p, rx8_p] + elif self.sfp_type == QSFP_TYPE: + rx1_p = transceiver_bulk_status.get("rx1power", "N/A") + rx2_p = transceiver_bulk_status.get("rx2power", "N/A") + rx3_p = transceiver_bulk_status.get("rx3power", "N/A") + rx4_p = transceiver_bulk_status.get("rx4power", "N/A") + rx_power_list = [rx1_p, rx2_p, rx3_p, rx4_p] + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of all SFP channels + Returns: + A list of floats, representing TX power in mW + for each available channel + E.g., for a tranceiver with four channels: ['1.86', '1.86', '1.86', '1.86'] + """ + + tx_power_list = [] + transceiver_bulk_status = self.get_transceiver_bulk_status() + if self.sfp_type == OSFP_TYPE: + tx1_p = transceiver_bulk_status.get("tx1power", "N/A") + tx2_p = transceiver_bulk_status.get("tx2power", "N/A") + tx3_p = transceiver_bulk_status.get("tx3power", "N/A") + tx4_p = transceiver_bulk_status.get("tx4power", "N/A") + tx5_p = transceiver_bulk_status.get("tx5power", "N/A") + tx6_p = transceiver_bulk_status.get("tx6power", "N/A") + tx7_p = transceiver_bulk_status.get("tx7power", "N/A") + tx8_p = transceiver_bulk_status.get("tx8power", "N/A") + tx_power_list = [tx1_p, tx2_p, tx3_p, tx4_p, tx5_p, tx6_p, tx7_p, tx8_p] + elif self.sfp_type == QSFP_TYPE: + tx1_p = transceiver_bulk_status.get("tx1power", "N/A") + tx2_p = transceiver_bulk_status.get("tx2power", "N/A") + tx3_p = transceiver_bulk_status.get("tx3power", "N/A") + tx4_p = transceiver_bulk_status.get("tx4power", "N/A") + tx_power_list = [tx1_p, tx2_p, tx3_p, tx4_p] + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # Check for invalid port_num + + try: + port_reset_path = self.RESET_PATH.format(self.port_num) + reg_file = open(port_reset_path, "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(0)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(port_reset_path, "w") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + reg_file.seek(0) + reg_file.write(hex(1)) + reg_file.close() + + if self.sfp_type == OSFP_TYPE: # Not found reset status in QSFP-DD eeprom map + return True + elif self.sfp_type == QSFP_TYPE: + reset_status_raw = self.__read_eeprom_specific_bytes(QSFP_RESET_STATUS_OFFSET, QSFP_RESET_STATUS_WIDTH) + reset_status_data = int(reset_status_raw[0], 16) + if reset_status_data: + return reset_status_data & 0x01 != 0 + else: + return False + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + + if self.sfp_type == OSFP_TYPE or self.sfp_type == QSFP_TYPE: + try: + tx_disable_ctl = 0xff if tx_disable else 0x0 + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + with open(self.port_to_eeprom_mapping[self.port_num], "r+b") as sysfsfile_eeprom: + if self.sfp_type == QSFP_TYPE: + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + else: + # eeprom switch to page 0x10 + if not self.__switch_to_page(OSFP_LANE_SPECIFIC_CTRL_PAGE): + return False + sysfsfile_eeprom.seek(OSFP_CHANNL_DISABLE_STATUS_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + return True + except Exception as e: + print("Error: unable to open file: %s" % str(e)) + return False + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + + channel_state = self.get_tx_disable_channel() + tx_disable_ctl = channel_state + + if self.sfp_type == OSFP_TYPE: + tx_enable_mask = [0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f] + tx_disable_mask = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80] + # 8 channels 7-0 + for i in range(7, -1, -1): + if ((channel >> i) & 0x01) > 0: + tx_disable_ctl = tx_disable_ctl | tx_disable_mask[i] \ + if disable else tx_disable_ctl & tx_enable_mask[i] + + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + try: + with open(self.port_to_eeprom_mapping[self.port_num], "r+b") as sysfsfile_eeprom: + # eeprom switch to page 0x10 + if not self.__switch_to_page(OSFP_LANE_SPECIFIC_CTRL_PAGE): + return False + + sysfsfile_eeprom.seek(OSFP_CHANNL_DISABLE_STATUS_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + return True + except IOError: + return False + elif self.sfp_type == QSFP_TYPE: + tx_enable_mask = [0xe, 0xd, 0xb, 0x7] + tx_disable_mask = [0x1, 0x2, 0x4, 0x8] + # 4 channels 3-0 + for i in range(3, -1, -1): + if ((channel >> i) & 0x01) > 0: + tx_disable_ctl = tx_disable_ctl | tx_disable_mask[i] \ + if disable else tx_disable_ctl & tx_enable_mask[i] + + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + try: + with open(self.port_to_eeprom_mapping[self.port_num], "r+b") as sysfsfile_eeprom: + sysfsfile_eeprom.seek(QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + return True + except IOError: + return False + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + try: + port_lpmode_path = self.LP_PATH.format(self.port_num) + reg_file = open(port_lpmode_path, "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # LPMode is active high; set or clear the bit accordingly + content = "1" if lpmode else "0" + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + # OSFP requires both lpmode pin and OSFP_POWERSET_BIT positive to make low power mode effect + if self.sfp_type == OSFP_TYPE and lpmode: + # eeprom switch to page 0 + if not self.__switch_to_page(OSFP_GLOBAL_CTRL_PAGE): + return None + + dom_control_raw = self.__read_eeprom_specific_bytes( + OSFP_POWEROVERRIDE_OFFSET, OSFP_POWEROVERRIDE_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = int(dom_control_raw[0], 16) + else: + return False + + self.__write_eeprom_specific_bytes( + OSFP_POWEROVERRIDE_OFFSET, [dom_control_data & ~(1 << OSFP_POWERSET_BIT)]) + return True + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + + # OSFP(QSFP-DD) Lpmode = True if (lpmode_pin & LowPwr Bit) or (1 == ForceLowPwr Bit) + # "lpmode_pin" "ForceLowPwr Bit" "LowPwr Bit" "Module Power Allowed" + # X 1 X Low Power + # 1 0 1 Low Power + # 1 0 0 High Power + # 0 0 1 High Power + # QSFP Lpmode = True if (1 == lpmode_pin and 0 == Power_overide Bit) or + # (1 == Power_overide Bit and 1 == Power_set Bit) + # "lpmode_pin" "Power_overide Bit" "Power_set Bit" "Module Power Allowed" + # 1 0 X Low Power + # 0 0 X High Power + # X 1 1 Low Power + # X 1 0 High Power + + if self.sfp_type == OSFP_TYPE: + # eeprom switch to page 0 + if not self.__switch_to_page(OSFP_GLOBAL_CTRL_PAGE): + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + OSFP_POWEROVERRIDE_OFFSET, OSFP_POWEROVERRIDE_WIDTH) if self.get_presence() else None + if dom_control_raw is not None: + dom_control_data = int(dom_control_raw[0], 16) + else: + return False + try: + if power_override and power_set: + self.__write_eeprom_specific_bytes( + OSFP_POWEROVERRIDE_OFFSET, [dom_control_data | (1 << OSFP_POWEROVERRIDE_BIT)]) + else: + self.__write_eeprom_specific_bytes( + OSFP_POWEROVERRIDE_OFFSET, [dom_control_data & ~(1 << OSFP_POWEROVERRIDE_BIT)]) + except IOError: + return False + return True + elif self.sfp_type == QSFP_TYPE: + try: + power_override_bit = 0 + if power_override: + power_override_bit |= 1 << 0 + + power_set_bit = 0 + if power_set: + power_set_bit |= 1 << 1 + + buffer = create_string_buffer(1) + buffer[0] = chr(power_override_bit | power_set_bit) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError: + # print("Error: unable to open file: %s" % str(e)) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + return False + + ############################################################## + ###################### Device methods ######################## + ############################################################## + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + sfputil_helper = SfpUtilHelper() + sfputil_helper.read_porttab_mappings( + self.__get_path_to_port_config_file()) + name = sfputil_helper.logical[self.index] or "Unknown" + return name + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + if OSFP_PORT_START <= self.port_num <= OSFP_PORT_END: + port_present_path = self.OSFP_PRS_PATH.format(self.port_num) + elif SFP_PORT_START <= self.port_num <= SFP_PORT_END: + port_present_path = self.SFP_PRS_PATH.format(self.port_num - SFP_PORT_START + 1) + else: + print("Out of SFP range {} - {}".format(PORT_START, PORT_END)) + return False + presence_status_raw = self._api_helper.read_txt_file(port_present_path).rstrip() + if not presence_status_raw: + return False + + # ModPrsL is active low + if presence_status_raw == '0': + return True + + return False + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_info_dict = self.get_transceiver_info() + return transceiver_info_dict.get("model", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_info_dict = self.get_transceiver_info() + return transceiver_info_dict.get("serial", "N/A") + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() and not self.get_reset_status() diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal.py new file mode 100644 index 00000000000..f86a53450a3 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path + +try: + from sonic_platform_base.thermal_base import ThermalBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NULL_VAL = "N/A" +I2C_ADAPTER_PATH = "/sys/class/i2c-adapter" +IPMI_SENSOR_TEMP_CMD = "ipmitool sensor | grep degrees" +THERMAL_INFO = [ + {'name': 'TEMP_FB_U52', 'temp': 'na'}, # 0 + {'name': 'TEMP_FB_U17', 'temp': 'na'}, # 1 + {'name': 'TEMP_SW_U2', 'temp': 'na'}, # 2 + {'name': 'TEMP_CPU', 'temp': 'na'}, # 3 + {'name': 'TEMP_DIMM0', 'temp': 'na'}, # 4 + {'name': 'TEMP_DIMM1', 'temp': 'na'}, # 5 + {'name': 'TEMP_SW_Internal', 'temp': 'na'}, # 6 + {'name': 'PSU1_Temp1', 'temp': 'na'}, # 7 + {'name': 'PSU1_Temp2', 'temp': 'na'}, # 8 + {'name': 'PSU1_Temp3', 'temp': 'na'}, # 9 + {'name': 'PSU2_Temp1', 'temp': 'na'}, # 10 + {'name': 'PSU2_Temp2', 'temp': 'na'}, # 11 + {'name': 'PSU2_Temp3', 'temp': 'na'}, # 12 + {'name': 'TEMP_SW_U52', 'temp': 'na'}, # 13 + {'name': 'TEMP_SW_U16', 'temp': 'na'}, # 14 + {'name': 'I91_CORE_Temp', 'temp': 'na'}, # 15 + {'name': 'I89_AVDD_Temp', 'temp': 'na'}, # 16 + {'name': 'QSFP_DD_Temp1', 'temp': 'na'}, # 17 + {'name': 'QSFP_DD_Temp2', 'temp': 'na'}, # 18 +] + +thermal_temp_dict = { + "TEMP_FB_U52": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "TEMP_FB_U17": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": 52, "F2B": NULL_VAL}, "high_critical_threshold": {"B2F": 57, "F2B": NULL_VAL}}, + "TEMP_SW_U2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "TEMP_CPU": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, "max": 103, "high_critical_threshold": NULL_VAL}, + "TEMP_DIMM0": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 85}, + "TEMP_DIMM1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max":NULL_VAL, "high_critical_threshold": 85}, + "TEMP_SW_Internal": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": 105, "high_critical_threshold": 111}, + "PSU1_Temp1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 60}, + "PSU1_Temp2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 113}, + "PSU1_Temp3": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": {"B2F": 75, "F2B": 88}}, + "PSU2_Temp1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 60}, + "PSU2_Temp2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 113}, + "PSU2_Temp3": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": {"B2F": 75, "F2B": 88}}, + "TEMP_SW_U52": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": {"B2F": NULL_VAL, "F2B": 58}, "high_critical_threshold": {"B2F": NULL_VAL, "F2B": 62}}, + "TEMP_SW_U16": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": NULL_VAL}, + "I91_CORE_Temp": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 125}, + "I89_AVDD_Temp": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 125}, + "QSFP_DD_Temp1": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 125}, + "QSFP_DD_Temp2": {"low_critical_threshold": NULL_VAL, "min": NULL_VAL, + "max": NULL_VAL, "high_critical_threshold": 125}, +} + + + +temp_result = [] +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + SS_CONFIG_PATH = "/usr/share/sonic/device/x86_64-cel_silverstone-x-r0/sonic_platform/sensors.conf" + + def __init__(self, thermal_index, airflow): + + self.index = thermal_index + self._api_helper = APIHelper() + self._airflow = str(airflow).upper() + self._thermal_info = THERMAL_INFO[self.index] + self.name = self.get_name() + + def __get_thermal_info(self): + """ + Complete other path information according to the corresponding BUS path + """ + global temp_result + + if self.index == 0: + status, temp_result_str = self._api_helper.run_command(IPMI_SENSOR_TEMP_CMD) + temp_result = temp_result_str.split('\n') + + for i in temp_result: + if '|' not in i: + continue + sigle_list = i.split('|') + if self._thermal_info["name"] == sigle_list[0].strip(): + self._thermal_info["temp"] = sigle_list[1].strip() + break + + def __set_threshold(self, temperature): + temp_file_path = self._thermal_info.get("max_temp", "N/A") + try: + with open(temp_file_path, 'w') as fd: + fd.write(str(temperature)) + return True + except IOError: + return False + + 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 + """ + self.__get_thermal_info() + temperature = self._thermal_info.get("temp", "na") + if temperature != "na": + temperature = float(temperature) + else: + temperature = 0 + return float("{:.3f}".format(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 + """ + high_threshold = thermal_temp_dict.get(self.name).get("max") + if isinstance(high_threshold, dict): + high_threshold = high_threshold.get(self._airflow) + if high_threshold != NULL_VAL: + high_threshold = float("{:.3f}".format(high_threshold)) + return 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 + """ + low_threshold = thermal_temp_dict.get(self.name).get("min") + if low_threshold != NULL_VAL: + low_threshold = float("{:.3f}".format(low_threshold)) + return low_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 + """ + temp_file = "temp1_max" + is_set = self.__set_threshold(int(temperature) * 1000) + file_set = False + if is_set: + try: + with open(self.SS_CONFIG_PATH, 'r+') as f: + content = f.readlines() + f.seek(0) + ss_found = False + for idx, val in enumerate(content): + if self.name in val: + ss_found = True + elif ss_found and temp_file in val: + content[idx] = " set {} {}\n".format( + temp_file, temperature) + f.writelines(content) + file_set = True + break + except IOError: + file_set = False + + return is_set & file_set + + @staticmethod + def set_low_threshold(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 + """ + # Not Support + return False + + 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 + """ + high_critical_threshold = thermal_temp_dict.get(self.name).get("high_critical_threshold") + if isinstance(high_critical_threshold, dict): + high_critical_threshold = high_critical_threshold.get(str(self._airflow).upper()) + if high_critical_threshold != NULL_VAL: + high_critical_threshold = float("{:.3f}".format(float(high_critical_threshold))) + return high_critical_threshold + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + low_critical_threshold = thermal_temp_dict.get(self.name).get("low_critical_threshold") + if low_critical_threshold != NULL_VAL: + low_critical_threshold = float("{:.3f}".format(float(low_critical_threshold))) + return low_critical_threshold + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return self._thermal_info.get("name") + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + return os.path.isfile(self._thermal_info.get("temp", NULL_VAL)) + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._thermal_info.get("model", NULL_VAL) + + @staticmethod + def get_serial(): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return NULL_VAL + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + return True diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_actions.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_actions.py new file mode 100644 index 00000000000..545db861f68 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_actions.py @@ -0,0 +1,78 @@ + +from sonic_platform_base.sonic_thermal_control.thermal_action_base import ThermalPolicyActionBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object +from .thermal_infos import ChassisInfo +from .helper import APIHelper + + +@thermal_json_object('thermal_control.control') +class ControlThermalAlgoAction(ThermalPolicyActionBase): + """ + Action to control the thermal control algorithm + """ + # JSON field definition + JSON_FIELD_STATUS = 'status' + + def __init__(self): + self.status = True + + def load_from_json(self, json_obj): + """ + Construct ControlThermalAlgoAction via JSON. JSON example: + { + "type": "thermal_control.control" + "status": "true" + } + :param json_obj: A JSON object representing a ControlThermalAlgoAction action. + :return: + """ + if ControlThermalAlgoAction.JSON_FIELD_STATUS in json_obj: + status_str = json_obj[ControlThermalAlgoAction.JSON_FIELD_STATUS].lower() + if status_str == 'true': + self.status = True + elif status_str == 'false': + self.status = False + else: + raise ValueError('Invalid {} field value, please specify true of false'. + format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) + else: + raise ValueError('ControlThermalAlgoAction ' + 'missing mandatory field {} in JSON policy file'. + format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) + + def execute(self, thermal_info_dict): + """ + Disable thermal control algorithm + :param thermal_info_dict: A dictionary stores all thermal information. + :return: + """ + if ChassisInfo.INFO_NAME in thermal_info_dict: + chassis_info_obj = thermal_info_dict[ChassisInfo.INFO_NAME] + chassis = chassis_info_obj.get_chassis() + thermal_manager = chassis.get_thermal_manager() + if self.status: + thermal_manager.start_thermal_control_algorithm() + else: + thermal_manager.stop_thermal_control_algorithm() + + +@thermal_json_object('switch.power_cycling') +class SwitchPolicyAction(ThermalPolicyActionBase): + """ + Base class for thermal action. Once all thermal conditions in a thermal policy are matched, + all predefined thermal action will be executed. + """ + + def execute(self, thermal_info_dict): + """ + Take action when thermal condition matches. For example, power cycle the switch. + :param thermal_info_dict: A dictionary stores all thermal information. + :return: + """ + thermal_overload_position_path = '/tmp/thermal_overload_position' + thermal_overload_position = APIHelper().read_one_line_file( + thermal_overload_position_path) + + cmd = 'bash /usr/share/sonic/platform/thermal_overload_control.sh {}'.format( + thermal_overload_position) + APIHelper().run_command(cmd) diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_conditions.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_conditions.py new file mode 100644 index 00000000000..1eee8ea91ab --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_conditions.py @@ -0,0 +1,77 @@ +from sonic_platform_base.sonic_thermal_control.thermal_condition_base import ThermalPolicyConditionBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object + + +class FanCondition(ThermalPolicyConditionBase): + def get_fan_info(self, thermal_info_dict): + from .thermal_infos import FanInfo + if FanInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[FanInfo.INFO_NAME], FanInfo): + return thermal_info_dict[FanInfo.INFO_NAME] + else: + return None + + +@thermal_json_object('fan.any.absence') +class AnyFanAbsenceCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_absence_fans()) > 0 if fan_info_obj else False + + +@thermal_json_object('fan.any.fault') +class AnyFanFaultCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_fault_fans()) > 0 if fan_info_obj else False + + +@thermal_json_object('fan.all.presence') +class AllFanPresenceCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_absence_fans()) == 0 if fan_info_obj else False + + +@thermal_json_object('fan.all.good') +class AllFanGoodCondition(FanCondition): + def is_match(self, thermal_info_dict): + fan_info_obj = self.get_fan_info(thermal_info_dict) + return len(fan_info_obj.get_fault_fans()) == 0 if fan_info_obj else False + + +class ThermalCondition(ThermalPolicyConditionBase): + def get_thermal_info(self, thermal_info_dict): + from .thermal_infos import ThermalInfo + if ThermalInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo): + return thermal_info_dict[ThermalInfo.INFO_NAME] + else: + return None + + +@thermal_json_object('thermal.over.high_threshold') +class ThermalOverHighCriticalCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return thermal_info_obj.is_over_high_threshold() + else: + return False + + +@thermal_json_object('thermal.over.high_critical_threshold') +class ThermalOverHighCriticalCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return thermal_info_obj.is_over_high_critical_threshold() + else: + return False + +@thermal_json_object('thermal.all.good') +class ThermalGoodCondition(ThermalCondition): + def is_match(self, thermal_info_dict): + thermal_info_obj = self.get_thermal_info(thermal_info_dict) + if thermal_info_obj: + return not thermal_info_obj.is_over_threshold() + else: + return False diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_infos.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_infos.py new file mode 100644 index 00000000000..a680b31b634 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_infos.py @@ -0,0 +1,165 @@ +from sonic_platform_base.sonic_thermal_control.thermal_info_base import ThermalPolicyInfoBase +from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object +from .helper import APIHelper +import time + + +@thermal_json_object('fan_info') +class FanInfo(ThermalPolicyInfoBase): + """ + Fan information needed by thermal policy + """ + + # Fan information name + INFO_NAME = 'fan_info' + + def __init__(self): + self._absence_fans = set() + self._presence_fans = set() + self._fault_fans = set() + self._status_changed = False + + def collect(self, chassis): + """ + Collect absence and presence fans. + :param chassis: The chassis object + :return: + """ + self._status_changed = False + for fan in chassis.get_all_fans(): + presence = fan.get_presence() + status = fan.get_status() + if presence and fan not in self._presence_fans: + self._presence_fans.add(fan) + self._status_changed = True + if fan in self._absence_fans: + self._absence_fans.remove(fan) + elif not presence and fan not in self._absence_fans: + self._absence_fans.add(fan) + self._status_changed = True + if fan in self._presence_fans: + self._presence_fans.remove(fan) + + if not status and fan not in self._fault_fans: + self._fault_fans.add(fan) + self._status_changed = True + + elif status and fan in self._fault_fans: + self._fault_fans.remove(fan) + self._status_changed = True + + def get_absence_fans(self): + """ + Retrieves absence fans + :return: A set of absence fans + """ + return self._absence_fans + + def get_presence_fans(self): + """ + Retrieves presence fans + :return: A set of presence fans + """ + return self._presence_fans + + def get_fault_fans(self): + """ + Retrieves fault fans + :return: A set of fault fans + """ + return self._fault_fans + + def is_status_changed(self): + """ + Retrieves if the status of fan information changed + :return: True if status changed else False + """ + return self._status_changed + + +@thermal_json_object('thermal_info') +class ThermalInfo(ThermalPolicyInfoBase): + """ + Thermal information needed by thermal policy + """ + + # Fan information name + INFO_NAME = 'thermal_info' + + def collect(self, chassis): + """ + Collect thermal sensor temperature change status + :param chassis: The chassis object + :return: + """ + self._over_high_threshold = False + self._over_high_critical_threshold = False + self._thermal_overload_position = 'cpu' + + # Calculate average temp within the device + temp = 0 + num_of_thermals = chassis.get_num_thermals() + for index in range(num_of_thermals): + thermal = chassis.get_thermal(index) + temp = thermal.get_temperature() + high_threshold = thermal.get_high_threshold() + high_critical_threshold = thermal.get_high_critical_threshold() + + if high_threshold and temp > high_threshold: + self._over_high_threshold = True + + if high_critical_threshold and temp > high_critical_threshold: + self._thermal_overload_position = thermal.postion + self._over_high_critical_threshold = True + + def is_over_threshold(self): + """ + Retrieves if the temperature is over any threshold + :return: True if the temperature is over any threshold else False + """ + return self._over_high_threshold or self._over_high_critical_threshold + + def is_over_high_critical_threshold(self): + """ + Retrieves if the temperature is over high critical threshold + :return: True if the temperature is over high critical threshold else False + """ + thermal_overload_position_path = '/tmp/thermal_overload_position' + if self._over_high_critical_threshold: + APIHelper().write_txt_file(thermal_overload_position_path, + self._thermal_overload_position) + time.sleep(1) + return self._over_high_critical_threshold + + def is_over_high_threshold(self): + """ + Retrieves if the temperature is over high threshold + :return: True if the temperature is over high threshold else False + """ + return self._over_high_threshold + + +@thermal_json_object('chassis_info') +class ChassisInfo(ThermalPolicyInfoBase): + """ + Chassis information needed by thermal policy + """ + INFO_NAME = 'chassis_info' + + def __init__(self): + self._chassis = None + + def collect(self, chassis): + """ + Collect platform chassis. + :param chassis: The chassis object + :return: + """ + self._chassis = chassis + + def get_chassis(self): + """ + Retrieves platform chassis object + :return: A platform chassis object. + """ + return self._chassis diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_manager.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_manager.py new file mode 100644 index 00000000000..d471629c3e6 --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/thermal_manager.py @@ -0,0 +1,46 @@ +from sonic_platform_base.sonic_thermal_control.thermal_manager_base import ThermalManagerBase +from .helper import APIHelper +#from .thermal_actions import * +#from .thermal_conditions import * +#from .thermal_infos import * + +class ThermalManager(ThermalManagerBase): + FSC_ALGORITHM_CMD = 'service fancontrol {}' + + @classmethod + def start_thermal_control_algorithm(cls): + """ + Start vendor specific thermal control algorithm. The default behavior of this function is a no-op. + :return: + """ + return cls._enable_fancontrol_service(True) + + @classmethod + def stop_thermal_control_algorithm(cls): + """ + Stop thermal control algorithm + Returns: + bool: True if set success, False if fail. + """ + return cls._enable_fancontrol_service(False) + + @classmethod + def deinitialize(cls): + """ + Destroy thermal manager, including any vendor specific cleanup. The default behavior of this function + is a no-op. + :return: + """ + return cls._enable_fancontrol_service(True) + + @classmethod + def _enable_fancontrol_service(cls, enable): + """ + Control thermal by fcs algorithm + Args: + enable: Bool, indicate enable the algorithm or not + Returns: + bool: True if set success, False if fail. + """ + cmd = 'start' if enable else 'stop' + return APIHelper().run_command(cls.FSC_ALGORITHM_CMD.format(cmd)) diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/watchdog.py b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/watchdog.py new file mode 100644 index 00000000000..5c5fa33398a --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/sonic_platform/watchdog.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Watchdog contains an implementation of SONiC Platform Base API +# +############################################################################# +import os +import time + +try: + from sonic_platform_base.watchdog_base import WatchdogBase + from helper import APIHelper +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PLATFORM_CPLD_PATH = '/sys/devices/platform/sys_cpld' +GETREG_FILE = 'getreg' +SETREG_FILE = 'setreg' +WDT_ENABLE_REG = '0xA187' +WDT_SET_TIMER_L_BIT_REG = '0xA183' +WDT_SET_TIMER_M_BIT_REG = '0xA182' +WDT_SET_TIMER_H_BIT_REG = '0xA181' + +WDT_TIMER_L_BIT_REG = '0xA186' +WDT_TIMER_M_BIT_REG = '0xA185' +WDT_TIMER_H_BIT_REG = '0xA184' + +WDT_KEEP_ALVIVE_REG = '0xA188' +ENABLE_CMD = '0x1' +DISABLE_CMD = '0x0' +WDT_COMMON_ERROR = -1 + + +class Watchdog(WatchdogBase): + def __init__(self): + # Init helper + self._api_helper = APIHelper() + + # Init cpld reg path + self.setreg_path = os.path.join(PLATFORM_CPLD_PATH, SETREG_FILE) + self.getreg_path = os.path.join(PLATFORM_CPLD_PATH, GETREG_FILE) + + # Set default value + #self._disable() + #self.armed = False + value = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_ENABLE_REG) + hex_time = '{}'.format(value) + value = int(hex_time, 16) + self.armed = True if value else False + self.timeout = self._gettimeout() + self.arm_timestamp = 0 + + def _enable(self): + """ + Turn on the watchdog timer + """ + # echo 0xA187 0x1 > /sys/devices/platform/sys_cpld/setreg + enable_val = '{} {}'.format(WDT_ENABLE_REG, ENABLE_CMD) + return self._api_helper.write_txt_file(self.setreg_path, enable_val) + + def _disable(self): + """ + Turn off the watchdog timer + """ + # echo 0xA187 0x0 > /sys/devices/platform/sys_cpld/setreg + disable_val = '{} {}'.format(WDT_ENABLE_REG, DISABLE_CMD) + return self._api_helper.write_txt_file(self.setreg_path, disable_val) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + + # echo 0xA188 > /sys/devices/platform/sys_cpld/getreg + # value = $(cat /sys/devices/platform/sys_cpld/getreg) + # echo 0xA188 (~ $value) & 0x01 > /sys/devices/platform/sys_cpld/setreg + + value = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_KEEP_ALVIVE_REG) + value = int(value, 16) + enable_val = '{} 0x{}'.format(WDT_KEEP_ALVIVE_REG, (~value) & 0x01) + return self._api_helper.write_txt_file(self.setreg_path, enable_val) + + def _get_level_hex(self, sub_hex): + sub_hex_str = sub_hex.replace("x", "0") + return hex(int(sub_hex_str, 16)) + + def _seconds_to_lmh_hex(self, seconds): + ms = seconds*1000 # calculate timeout in ms format + hex_str = hex(ms) + l = self._get_level_hex(hex_str[-2:]) + m = self._get_level_hex(hex_str[-4:-2]) + h = self._get_level_hex(hex_str[-6:-4]) + return (l, m, h) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + # max = 0xffffff = 16777.215 seconds + + (l, m, h) = self._seconds_to_lmh_hex(seconds) + set_h_val = '{} {}'.format(WDT_SET_TIMER_H_BIT_REG, h) + set_m_val = '{} {}'.format(WDT_SET_TIMER_M_BIT_REG, m) + set_l_val = '{} {}'.format(WDT_SET_TIMER_L_BIT_REG, l) + + self._api_helper.write_txt_file(self.setreg_path, set_h_val) + self._api_helper.write_txt_file(self.setreg_path, set_m_val) + self._api_helper.write_txt_file(self.setreg_path, set_l_val) + + return seconds + + def _gettimeout(self): + """ + Get watchdog timeout + @return watchdog timeout + """ + + h_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_SET_TIMER_H_BIT_REG) + m_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_SET_TIMER_M_BIT_REG) + l_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_SET_TIMER_L_BIT_REG) + + hex_time = '0x{}{}{}'.format(h_bit[2:], m_bit[2:], l_bit[2:]) + ms = int(hex_time, 16) + return int(float(ms)/1000) + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of 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 , 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. + """ + + ret = WDT_COMMON_ERROR + if seconds < 0 or seconds > int(0xffffff/1000): + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + + if self.armed: + self._keepalive() + else: + self._enable() + self._keepalive() + self.armed = True + + ret = self.timeout + self.arm_timestamp = time.time() + except IOError as e: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + return self.armed + + 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 thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + h_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_H_BIT_REG) + m_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_M_BIT_REG) + l_bit = self._api_helper.get_cpld_reg_value( + self.getreg_path, WDT_TIMER_L_BIT_REG) + + hex_time = '0x{}{}{}'.format(h_bit[2:], m_bit[2:], l_bit[2:]) + ms = int(hex_time, 16) + return int(float(ms)/1000) if self.armed else WDT_COMMON_ERROR diff --git a/device/celestica/x86_64-cel_silverstone-x-r0/topo.conf b/device/celestica/x86_64-cel_silverstone-x-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/celestica/x86_64-cel_silverstone-x-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/common/profiles/th/6100/BALANCED/buffers_defaults_t0.j2 b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..ed5c9deac0c --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t0.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..f1a4c9c2e2f --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/buffers_defaults_t1.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th/6100/BALANCED/pg_profile_lookup.ini new file mode 100644 index 00000000000..0b5d680edda --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 79872 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 56160 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 85696 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/6100/BALANCED/qos.json.j2 b/device/common/profiles/th/6100/BALANCED/qos.json.j2 new file mode 100644 index 00000000000..34002048afd --- /dev/null +++ b/device/common/profiles/th/6100/BALANCED/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t0.j2 b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..ed5c9deac0c --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t0.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t1.j2 b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..f1a4c9c2e2f --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/buffers_defaults_t1.j2 @@ -0,0 +1,42 @@ + +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/pg_profile_lookup.ini b/device/common/profiles/th/6100/RDMA-CENTRIC/pg_profile_lookup.ini new file mode 100644 index 00000000000..0b5d680edda --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 79872 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 56160 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 85696 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/6100/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th/6100/RDMA-CENTRIC/qos.json.j2 new file mode 100644 index 00000000000..34002048afd --- /dev/null +++ b/device/common/profiles/th/6100/RDMA-CENTRIC/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/6100/TCP-CENTRIC b/device/common/profiles/th/6100/TCP-CENTRIC new file mode 120000 index 00000000000..d6f7127aa74 --- /dev/null +++ b/device/common/profiles/th/6100/TCP-CENTRIC @@ -0,0 +1 @@ +BALANCED \ No newline at end of file diff --git a/device/common/profiles/th/gen/BALANCED/buffers_defaults_t0.j2 b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..c671233a02f --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t0.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..11aab2cabd4 --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/buffers_defaults_t1.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th/gen/BALANCED/pg_profile_lookup.ini new file mode 100644 index 00000000000..673df369a9b --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 90272 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 53248 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 96096 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/gen/BALANCED/qos.json.j2 b/device/common/profiles/th/gen/BALANCED/qos.json.j2 new file mode 100644 index 00000000000..34002048afd --- /dev/null +++ b/device/common/profiles/th/gen/BALANCED/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t0.j2 b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..c671233a02f --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t0.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t1.j2 b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..11aab2cabd4 --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/buffers_defaults_t1.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '40m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "10875072", + "type": "ingress", + "mode": "dynamic", + "xoff": "4194112" + }, + "egress_lossy_pool": { + "size": "9243812", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "15982720", + "type": "egress", + "mode": "static" + } + }, + "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":"1518", + "static_th":"15982720" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/pg_profile_lookup.ini b/device/common/profiles/th/gen/RDMA-CENTRIC/pg_profile_lookup.ini new file mode 100644 index 00000000000..673df369a9b --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 10000 5m 1248 2288 35776 0 2288 + 25000 5m 1248 2288 53248 0 2288 + 40000 5m 1248 2288 66560 0 2288 + 50000 5m 1248 2288 90272 0 2288 + 100000 5m 1248 2288 165568 0 2288 + 10000 40m 1248 2288 37024 0 2288 + 25000 40m 1248 2288 53248 0 2288 + 40000 40m 1248 2288 71552 0 2288 + 50000 40m 1248 2288 96096 0 2288 + 100000 40m 1248 2288 177632 0 2288 + 10000 300m 1248 2288 46176 0 2288 + 25000 300m 1248 2288 79040 0 2288 + 40000 300m 1248 2288 108160 0 2288 + 50000 300m 1248 2288 141856 0 2288 + 100000 300m 1248 2288 268736 0 2288 diff --git a/device/common/profiles/th/gen/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th/gen/RDMA-CENTRIC/qos.json.j2 new file mode 100644 index 00000000000..34002048afd --- /dev/null +++ b/device/common/profiles/th/gen/RDMA-CENTRIC/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "250000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th/gen/TCP-CENTRIC b/device/common/profiles/th/gen/TCP-CENTRIC new file mode 120000 index 00000000000..d6f7127aa74 --- /dev/null +++ b/device/common/profiles/th/gen/TCP-CENTRIC @@ -0,0 +1 @@ +BALANCED \ No newline at end of file diff --git a/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t0.j2 b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..891653a5ddb --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t0.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "33329088", + "type": "ingress", + "mode": "dynamic", + "xoff": "7827456" + }, + "egress_lossy_pool": { + "size": "26663272", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "42349632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"0", + "static_th":"42349632" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6192fa323d5 --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/buffers_defaults_t1.j2 @@ -0,0 +1,47 @@ +{%- set default_cable = '300m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + {# SS Tab2 Row 71 #} + "size": "33582016", + "type": "ingress", + "mode": "dynamic", + {# SS Tab2 Row 68 #} + "xoff": "8965632" + }, + "egress_lossy_pool": { + {# SS Tab2 Row 60 #} + "size": "26866112", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + {# SS Tab2 Row 56 #} + "size": "43481152", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + {# SS Tab1 Row 9 #} + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"0", + {# SS Tab2 Row 56 #} + "static_th":"43481152" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini b/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini new file mode 100644 index 00000000000..0ff01d9aa52 --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/pg_profile_lookup.ini @@ -0,0 +1,11 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 100000 5m 1248 1248 54080 0 2496 + 100000 40m 1248 1248 59696 0 2496 + 100000 300m 1248 1248 101088 0 2496 + 50000 5m 1248 1248 54080 0 2496 + 50000 40m 1248 1248 59696 0 2496 + 50000 300m 1248 1248 101088 0 2496 + 40000 5m 1248 1248 29536 0 2496 + 40000 40m 1248 1248 31616 0 2496 + 40000 300m 1248 1248 48256 0 2496 diff --git a/device/common/profiles/th2/7260/BALANCED/qos.json.j2 b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 new file mode 100644 index 00000000000..3e1d8df928c --- /dev/null +++ b/device/common/profiles/th2/7260/BALANCED/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t0.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..891653a5ddb --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t0.j2 @@ -0,0 +1,41 @@ +{%- set default_cable = '5m' %} + +{%- include 'buffer_ports_t0.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "33329088", + "type": "ingress", + "mode": "dynamic", + "xoff": "7827456" + }, + "egress_lossy_pool": { + "size": "26663272", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "42349632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"0", + "static_th":"42349632" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6192fa323d5 --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/buffers_defaults_t1.j2 @@ -0,0 +1,47 @@ +{%- set default_cable = '300m' %} + +{%- include 'buffer_ports_t1.j2' %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + {# SS Tab2 Row 71 #} + "size": "33582016", + "type": "ingress", + "mode": "dynamic", + {# SS Tab2 Row 68 #} + "xoff": "8965632" + }, + "egress_lossy_pool": { + {# SS Tab2 Row 60 #} + "size": "26866112", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + {# SS Tab2 Row 56 #} + "size": "43481152", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + {# SS Tab1 Row 9 #} + "static_th":"44302336" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"0", + {# SS Tab2 Row 56 #} + "static_th":"43481152" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1664", + "dynamic_th":"-1" + } + }, +{%- endmacro %} diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini b/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini new file mode 100644 index 00000000000..0ff01d9aa52 --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/pg_profile_lookup.ini @@ -0,0 +1,11 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 100000 5m 1248 1248 54080 0 2496 + 100000 40m 1248 1248 59696 0 2496 + 100000 300m 1248 1248 101088 0 2496 + 50000 5m 1248 1248 54080 0 2496 + 50000 40m 1248 1248 59696 0 2496 + 50000 300m 1248 1248 101088 0 2496 + 40000 5m 1248 1248 29536 0 2496 + 40000 40m 1248 1248 31616 0 2496 + 40000 300m 1248 1248 48256 0 2496 diff --git a/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 new file mode 100644 index 00000000000..3e1d8df928c --- /dev/null +++ b/device/common/profiles/th2/7260/RDMA-CENTRIC/qos.json.j2 @@ -0,0 +1,21 @@ +{%- macro generate_wred_profiles() %} + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "10000000", + "green_min_threshold" : "2000000", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + }, +{%- endmacro %} + +{%- include 'qos_config.j2' %} diff --git a/device/common/profiles/th2/7260/TCP-CENTRIC b/device/common/profiles/th2/7260/TCP-CENTRIC new file mode 120000 index 00000000000..d6f7127aa74 --- /dev/null +++ b/device/common/profiles/th2/7260/TCP-CENTRIC @@ -0,0 +1 @@ +BALANCED \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/td2-s6000-32x40G.config.bcm b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/td2-s6000-32x40G.config.bcm index 4c94db7107c..0e25b4d4232 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/td2-s6000-32x40G.config.bcm +++ b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/td2-s6000-32x40G.config.bcm @@ -20,7 +20,7 @@ parity_enable=1 stat_if_parity_enable=0 # -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/platform_reboot b/device/dell/x86_64-dell_s6000_s1220-r0/platform_reboot deleted file mode 100755 index dc6e3d517a8..00000000000 --- a/device/dell/x86_64-dell_s6000_s1220-r0/platform_reboot +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/python -import sys -import os -import struct - -NVRAM_RES = '/dev/nvram' -COLD_RESET = 0xE # Cold Reset -WARM_RESET = 0x6 # Warm Reset - -def io_reg_write(resource, offset, val): - fd = os.open(resource, os.O_RDWR) - if(fd < 0): - print 'file open failed %s" % resource' - return - if(os.lseek(fd, offset, os.SEEK_SET) != offset): - print 'lseek failed on %s' % resource - return - ret = os.write(fd, struct.pack('B', val)) - if(ret != 1): - print 'write failed %d' % ret - return - os.close(fd) - - -def power_reset(val): - with open('/sys/devices/platform/dell-s6000-cpld.0/power_reset', 'w') as p: - p.write(str(int(val)) + '\n') - p.flush() - -def gpio_direction(pin,direction): - kernpath = '/sys/class/gpio/gpio'+str(pin)+'/direction' - with open(('kernpath'), 'w') as p: - p.write(str(direction) + '\n') - p.flush() - -def gpio_set(pin,value): - kernpath = '/sys/class/gpio/gpio'+str(pin)+'/value' - with open(('kernpath'), 'w') as p: - p.write(str(int(value)) + '\n') - p.flush() - -def gpio_export(value): - with open('/sys/class/gpio/export', 'w') as p: - p.write(str(int(value)) + '\n') - p.flush() - - -if __name__ == "__main__": - io_reg_write(NVRAM_RES, 0x49, COLD_RESET) - if not os.path.isdir("/sys/class/gpio/gpio10"): - gpio_export(10) - gpio_direction("10","out") - #Toggle GPIO10 pin (to reset MUX) - gpio_set("10",1) - gpio_set("10",0) - power_reset(1) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index b27bf4bc22e..33be9e085f5 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -5,6 +5,7 @@ try: import time + import fcntl import datetime from sonic_sfp.sfputilbase import SfpUtilBase except ImportError as e: @@ -19,6 +20,7 @@ class SfpUtil(SfpUtilBase): PORTS_IN_BLOCK = 32 EEPROM_OFFSET = 20 + SFP_LOCK_FILE="/etc/sonic/sfp_lock" _port_to_eeprom_mapping = {} port_dict = {} @@ -73,10 +75,19 @@ def get_presence(self, port_num): if port_num < self.port_start or port_num > self.port_end: return False + try: + fd = open(self.SFP_LOCK_FILE, "r") + except IOError as e: + print("Error: unable to open file: "+ str(e)) + return False + fcntl.flock(fd, fcntl.LOCK_EX) + self.set_modsel(port_num) + try: reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modprs") except IOError as e: print "Error: unable to open file: %s" % str(e) + fcntl.flock(fd, fcntl.LOCK_UN) return False content = reg_file.readline().rstrip() @@ -86,13 +97,103 @@ def get_presence(self, port_num): # Mask off the bit corresponding to our port mask = (1 << port_num) - + fcntl.flock(fd, fcntl.LOCK_UN) # ModPrsL is active low if reg_value & mask == 0: return True return False + def get_modsel(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modsel") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + if reg_value & mask == 1: + return False + + return True + + def set_modsel(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modsel", "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + reg_value = reg_value | int("0xffffffff", 16) + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def get_eeprom_raw(self, port_num, num_bytes=256): + # Read interface id EEPROM at addr 0x50 + try: + fd = open(self.SFP_LOCK_FILE, "r") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return None + fcntl.flock(fd, fcntl.LOCK_EX) + self.set_modsel(port_num) + eeprom_bytes = self._read_eeprom_devid(port_num, self.IDENTITY_EEPROM_ADDR, 0, num_bytes) + fcntl.flock(fd, fcntl.LOCK_UN) + return eeprom_bytes + + def get_eeprom_dom_raw(self, port_num): + if port_num in self.osfp_ports: + return None + if port_num in self.qsfp_ports: + # QSFP DOM EEPROM is also at addr 0x50 and thus also stored in eeprom_ifraw + return None + else: + # Read dom eeprom at addr 0x51 + if not self.get_modsel(port_num): + try: + fd = open(self.SFP_LOCK_FILE, "r") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return None + fcntl.flock(fd, fcntl.LOCK_EX) + self.set_modsel(port_num) + eeprom_bytes = self._read_eeprom_devid(port_num, self.DOM_EEPROM_ADDR, 0) + fcntl.flock(fd, fcntl.LOCK_UN) + return eeprom_bytes + else: + return self._read_eeprom_devid(port_num, self.DOM_EEPROM_ADDR, 0) + + 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: diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/pmon_daemon_control.json b/device/dell/x86_64-dell_s6000_s1220-r0/pmon_daemon_control.json index 44871c057e8..94592fa8ceb 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/pmon_daemon_control.json +++ b/device/dell/x86_64-dell_s6000_s1220-r0/pmon_daemon_control.json @@ -1,4 +1,3 @@ { - "skip_ledd": true, - "skip_thermalctld": true + "skip_ledd": true } diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/BALANCED b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/BALANCED new file mode 120000 index 00000000000..6f064064664 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/BALANCED @@ -0,0 +1 @@ +../../../common/profiles/th/6100/BALANCED \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/RDMA-CENTRIC b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/RDMA-CENTRIC new file mode 120000 index 00000000000..4ab30f5ff42 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/RDMA-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/6100/RDMA-CENTRIC \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/TCP-CENTRIC b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/TCP-CENTRIC new file mode 120000 index 00000000000..d5d3a5b671b --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/TCP-CENTRIC @@ -0,0 +1 @@ +../../../common/profiles/th/6100/TCP-CENTRIC \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t0.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t0.j2 new file mode 100644 index 00000000000..ae201eb2593 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t0.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t1.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t1.j2 new file mode 100644 index 00000000000..ae201eb2593 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffer_ports_t1.j2 @@ -0,0 +1,6 @@ +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(0,64) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 deleted file mode 100644 index 8f55022973f..00000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '5m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..9524e6a476a --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 deleted file mode 100644 index 47a9c81f079..00000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 +++ /dev/null @@ -1,47 +0,0 @@ - -{%- set default_cable = '40m' %} - -{%- macro generate_port_lists(PORT_ALL) %} - {# Generate list of ports #} - {%- for port_idx in range(0,64) %} - {%- if PORT_ALL.append("Ethernet%d" % (port_idx)) %}{%- endif %} - {%- endfor %} -{%- endmacro %} - -{%- macro generate_buffer_pool_and_profiles() %} - "BUFFER_POOL": { - "ingress_lossless_pool": { - "size": "10875072", - "type": "ingress", - "mode": "dynamic", - "xoff": "4194112" - }, - "egress_lossy_pool": { - "size": "9243812", - "type": "egress", - "mode": "dynamic" - }, - "egress_lossless_pool": { - "size": "15982720", - "type": "egress", - "mode": "static" - } - }, - "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":"1518", - "static_th":"15982720" - }, - "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", - "dynamic_th":"3" - } - }, -{%- endmacro %} diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 new file mode 120000 index 00000000000..c25cc95d6d5 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +BALANCED/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini deleted file mode 100644 index 0b5d680edda..00000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini +++ /dev/null @@ -1,17 +0,0 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold xon_offset - 10000 5m 1248 2288 35776 0 2288 - 25000 5m 1248 2288 53248 0 2288 - 40000 5m 1248 2288 66560 0 2288 - 50000 5m 1248 2288 79872 0 2288 - 100000 5m 1248 2288 165568 0 2288 - 10000 40m 1248 2288 37024 0 2288 - 25000 40m 1248 2288 56160 0 2288 - 40000 40m 1248 2288 71552 0 2288 - 50000 40m 1248 2288 85696 0 2288 - 100000 40m 1248 2288 177632 0 2288 - 10000 300m 1248 2288 46176 0 2288 - 25000 300m 1248 2288 79040 0 2288 - 40000 300m 1248 2288 108160 0 2288 - 50000 300m 1248 2288 141856 0 2288 - 100000 300m 1248 2288 268736 0 2288 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini new file mode 120000 index 00000000000..297cddb2d22 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/pg_profile_lookup.ini @@ -0,0 +1 @@ +BALANCED/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 deleted file mode 100644 index 34002048afd..00000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 +++ /dev/null @@ -1,21 +0,0 @@ -{%- macro generate_wred_profiles() %} - "WRED_PROFILE": { - "AZURE_LOSSLESS" : { - "wred_green_enable" : "true", - "wred_yellow_enable" : "true", - "wred_red_enable" : "true", - "ecn" : "ecn_all", - "green_max_threshold" : "2097152", - "green_min_threshold" : "250000", - "yellow_max_threshold" : "2097152", - "yellow_min_threshold" : "1048576", - "red_max_threshold" : "2097152", - "red_min_threshold" : "1048576", - "green_drop_probability" : "5", - "yellow_drop_probability": "5", - "red_drop_probability" : "5" - } - }, -{%- endmacro %} - -{%- include 'qos_config.j2' %} diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 new file mode 120000 index 00000000000..aef6b6765cf --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json.j2 @@ -0,0 +1 @@ +BALANCED/qos.json.j2 \ No newline at end of file diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile.j2 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile.j2 index df3cbb55829..44992f92f45 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile.j2 +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile.j2 @@ -1,7 +1,7 @@ {# Get sai.profile based on switch_role #} {%- if DEVICE_METADATA is defined -%} {%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} -{%- if switch_role.lower() == 'torrouter' %} +{%- if 'torrouter' in switch_role.lower() %} {% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-s6100-64x40G-t0.config.bcm' -%} {%- else %} {%- set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-s6100-64x40G-t1.config.bcm' -%} @@ -11,3 +11,4 @@ {%- endif %} {# Write the contents of sai_ profile_filename to sai.profile file #} {{ sai_profile_contents }} +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t0.config.bcm b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t0.config.bcm index adbef9387ed..7fa57705263 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t0.config.bcm +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t0.config.bcm @@ -2,7 +2,7 @@ l3_alpm_enable=2 pfc_deadlock_seq_control=1 bcm_stat_interval=2000000 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t1.config.bcm b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t1.config.bcm index f9dc619849d..f55fb9d3ab5 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t1.config.bcm +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/th-s6100-64x40G-t1.config.bcm @@ -2,7 +2,7 @@ l3_alpm_enable=2 pfc_deadlock_seq_control=1 bcm_stat_interval=2000000 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/installer.conf b/device/dell/x86_64-dell_s6100_c2538-r0/installer.conf index 0a9a3a639eb..0932d063776 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/installer.conf +++ b/device/dell/x86_64-dell_s6100_c2538-r0/installer.conf @@ -1,3 +1,3 @@ CONSOLE_PORT=0x2f8 CONSOLE_DEV=1 -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="module_blacklist=gpio_ich" +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="module_blacklist=gpio_ich nos-config-part=/dev/sda12" diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py index ff4426ba10c..8ae1368cd6d 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py @@ -16,7 +16,6 @@ import time import os import logging - import select from sonic_sfp.sfputilbase import SfpUtilBase except ImportError as e: raise ImportError("%s - required module not found" % str(e)) @@ -110,7 +109,7 @@ class SfpUtil(SfpUtilBase): IOM_4_PORT_END = 63 BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{0}-003e/" - OIR_FD_PATH = "/sys/devices/platform/dell_ich.0/sci_int_gpio_sus6" + POLL_INTERVAL = 1 oir_fd = -1 epoll = -1 @@ -237,6 +236,7 @@ def __init__(self): "No IOM" SfpUtilBase.__init__(self) + self._transceiver_presence = self._get_transceiver_presence() def __del__(self): if self.oir_fd != -1: @@ -482,7 +482,7 @@ def reset(self, port_num): def get_register(self, reg_file): retval = 'ERR' - if (not os.path.isfile(reg_file)): + if not os.path.isfile(reg_file): print reg_file, 'not found !' return retval @@ -496,142 +496,88 @@ def get_register(self, reg_file): retval = retval.lstrip(" ") return retval - def check_interrupts(self, port_dict): - retval = 0 - is_port_dict_updated = False - - # Read the QSFP ABS interrupt & status registers - cpld2_abs_int = self.get_register( - "/sys/class/i2c-adapter/i2c-14/14-003e/qsfp_abs_int") - cpld2_abs_sta = self.get_register( - "/sys/class/i2c-adapter/i2c-14/14-003e/qsfp_abs_sta") - cpld3_abs_int = self.get_register( - "/sys/class/i2c-adapter/i2c-15/15-003e/qsfp_abs_int") - cpld3_abs_sta = self.get_register( - "/sys/class/i2c-adapter/i2c-15/15-003e/qsfp_abs_sta") - cpld4_abs_int = self.get_register( - "/sys/class/i2c-adapter/i2c-16/16-003e/qsfp_abs_int") - cpld4_abs_sta = self.get_register( - "/sys/class/i2c-adapter/i2c-16/16-003e/qsfp_abs_sta") - cpld5_abs_int = self.get_register( - "/sys/class/i2c-adapter/i2c-17/17-003e/qsfp_abs_int") - cpld5_abs_sta = self.get_register( - "/sys/class/i2c-adapter/i2c-17/17-003e/qsfp_abs_sta") - - if (cpld2_abs_int == 'ERR' or cpld2_abs_sta == 'ERR' or - cpld3_abs_int == 'ERR' or cpld3_abs_sta == 'ERR' or - cpld4_abs_int == 'ERR' or cpld4_abs_sta == 'ERR' or - cpld5_abs_int == 'ERR' or cpld5_abs_sta == 'ERR'): - return -1 - - # If IOM is not present, interrupt will return 'read error' - # Handle the scenario gracefully - if (cpld2_abs_int == 'read error'): - cpld2_abs_int = "0x0" - cpld2_abs_sta = "0x0" - if (cpld3_abs_int == 'read error'): - cpld3_abs_int = "0x0" - cpld3_abs_sta = "0x0" - if (cpld4_abs_int == 'read error'): - cpld4_abs_int = "0x0" - cpld4_abs_sta = "0x0" - if (cpld5_abs_int == 'read error'): - cpld5_abs_int = "0x0" - cpld5_abs_sta = "0x0" - - cpld2_abs_int = int(cpld2_abs_int, 16) - cpld2_abs_sta = int(cpld2_abs_sta, 16) - cpld3_abs_int = int(cpld3_abs_int, 16) - cpld3_abs_sta = int(cpld3_abs_sta, 16) - cpld4_abs_int = int(cpld4_abs_int, 16) - cpld4_abs_sta = int(cpld4_abs_sta, 16) - cpld5_abs_int = int(cpld5_abs_int, 16) - cpld5_abs_sta = int(cpld5_abs_sta, 16) - - # Make it contiguous - interrupt_reg = (cpld2_abs_int & 0xffff) | \ - ((cpld4_abs_int & 0xffff) << 16) | \ - ((cpld3_abs_int & 0xffff) << 32) | \ - ((cpld5_abs_int & 0xffff) << 48) - status_reg = (cpld2_abs_sta & 0xffff) | \ - ((cpld4_abs_sta & 0xffff) << 16) | \ - ((cpld3_abs_sta & 0xffff) << 32) | \ - ((cpld5_abs_sta & 0xffff) << 48) - - port = self.port_start - while port <= self.port_end: - if interrupt_reg & (1 << port): - # update only if atleast one port has generated - # interrupt - is_port_dict_updated = True - if status_reg & (1 << port): - # status reg 1 => optics is removed - port_dict[port] = '0' - else: - # status reg 0 => optics is inserted - port_dict[port] = '1' - port += 1 - return retval, is_port_dict_updated + def _get_transceiver_presence(self): + + cpld2_modprs = self.get_register( + "/sys/class/i2c-adapter/i2c-14/14-003e/qsfp_modprs") + cpld3_modprs = self.get_register( + "/sys/class/i2c-adapter/i2c-15/15-003e/qsfp_modprs") + cpld4_modprs = self.get_register( + "/sys/class/i2c-adapter/i2c-16/16-003e/qsfp_modprs") + cpld5_modprs = self.get_register( + "/sys/class/i2c-adapter/i2c-17/17-003e/qsfp_modprs") + + # If IOM is not present, register read will fail. + # Handle the scenario gracefully + if cpld2_modprs == 'read error' or cpld2_modprs == 'ERR': + cpld2_modprs = '0x0' + if cpld3_modprs == 'read error' or cpld3_modprs == 'ERR': + cpld3_modprs = '0x0' + if cpld4_modprs == 'read error' or cpld4_modprs == 'ERR': + cpld4_modprs = '0x0' + if cpld5_modprs == 'read error' or cpld5_modprs == 'ERR': + cpld5_modprs = '0x0' + + # Make it contiguous + transceiver_presence = (int(cpld2_modprs, 16) & 0xffff) |\ + ((int(cpld4_modprs, 16) & 0xffff) << 16) |\ + ((int(cpld3_modprs, 16) & 0xffff) << 32) |\ + ((int(cpld5_modprs, 16) & 0xffff) << 48) + + return transceiver_presence def get_transceiver_change_event(self, timeout=0): - port_dict = {} - try: - # We get notified when there is an SCI interrupt from GPIO SUS6 - # Open the sysfs file and register the epoll object - self.oir_fd = open(self.OIR_FD_PATH, "r") - if self.oir_fd != -1: - # Do a dummy read before epoll register - self.oir_fd.read() - self.epoll = select.epoll() - self.epoll.register(self.oir_fd.fileno(), - select.EPOLLIN & select.EPOLLET) - else: - print("get_transceiver_change_event : unable to create fd") - return False, {} - - # Check for missed interrupts by invoking self.check_interrupts - # which will update the port_dict. - while True: - interrupt_count_start = self.get_register(self.OIR_FD_PATH) - - retval, is_port_dict_updated = \ - self.check_interrupts(port_dict) - if ((retval == 0) and (is_port_dict_updated is True)): - return True, port_dict - - interrupt_count_end = self.get_register(self.OIR_FD_PATH) - - if (interrupt_count_start == 'ERR' or - interrupt_count_end == 'ERR'): - print("get_transceiver_change_event : \ - unable to retrive interrupt count") - break - - # check_interrupts() itself may take upto 100s of msecs. - # We detect a missed interrupt based on the count - if interrupt_count_start == interrupt_count_end: - break - - # Block until an xcvr is inserted or removed with timeout = -1 - events = self.epoll.poll( - timeout=timeout if timeout != 0 else -1) - if events: - # check interrupts and return the port_dict - retval, is_port_dict_updated = \ - self.check_interrupts(port_dict) - if (retval != 0): - return False, {} - - return True, port_dict - except: - return False, {} - finally: - if self.oir_fd != -1: - self.epoll.unregister(self.oir_fd.fileno()) - self.epoll.close() - self.oir_fd.close() - self.oir_fd = -1 - self.epoll = -1 - - return False, {} - + """ + Returns a dictionary containing optics insertion/removal status. + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + Returns: + (bool, dict): + - True if call successful, False if not; + """ + port_dict = {} + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + return False, port_dict # Incorrect timeout + + while True: + if forever: + timer = self.POLL_INTERVAL + else: + timer = min(timeout, self.POLL_INTERVAL) + start_time = time.time() + + time.sleep(timer) + cur_presence = self._get_transceiver_presence() + + # Update dict only if a change has been detected + if cur_presence != self._transceiver_presence: + changed_ports = self._transceiver_presence ^ cur_presence + for port in range(self.port_end): + # Mask off the bit corresponding to particular port + mask = 1 << port + if changed_ports & mask: + # qsfp_modprs 1 => optics is removed + if cur_presence & mask: + port_dict[port] = '0' + # qsfp_modprs 0 => optics is inserted + else: + port_dict[port] = '1' + + # Update current presence + self._transceiver_presence = cur_presence + break + + if not forever: + elapsed_time = time.time() - start_time + timeout = round(timeout - elapsed_time, 3) + if timeout <= 0: + break + + return True, port_dict diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/pmon_daemon_control.json b/device/dell/x86_64-dell_s6100_c2538-r0/pmon_daemon_control.json index 44871c057e8..94592fa8ceb 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/pmon_daemon_control.json +++ b/device/dell/x86_64-dell_s6100_c2538-r0/pmon_daemon_control.json @@ -1,4 +1,3 @@ { - "skip_ledd": true, - "skip_thermalctld": true + "skip_ledd": true } diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/s6100_cpld_upgrade b/device/dell/x86_64-dell_s6100_c2538-r0/s6100_cpld_upgrade new file mode 100755 index 00000000000..81af89a189b Binary files /dev/null and b/device/dell/x86_64-dell_s6100_c2538-r0/s6100_cpld_upgrade differ diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/sai.profile b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/sai.profile index a690c3ff8b9..1076ddfe28f 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/sai.profile +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-z9100-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/th-z9100-32x100G.config.bcm b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/th-z9100-32x100G.config.bcm index 39a3695b4cd..48fa30d7811 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/th-z9100-32x100G.config.bcm +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C32/th-z9100-32x100G.config.bcm @@ -3,7 +3,7 @@ l3_alpm_enable=2 pfc_deadlock_seq_control=1 bcm_stat_interval=2000000 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/sai.profile b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/sai.profile index 182624c19bd..b277ae5f0bd 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/sai.profile +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-z9100-8x100G-48x50G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/th-z9100-8x100G-48x50G.config.bcm b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/th-z9100-8x100G-48x50G.config.bcm index 3dd7cc89456..3130c801a38 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/th-z9100-8x100G-48x50G.config.bcm +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100-C8D48/th-z9100-8x100G-48x50G.config.bcm @@ -3,7 +3,7 @@ l3_alpm_enable=2 pfc_deadlock_seq_control=1 bcm_stat_interval=2000000 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C32/sai.profile b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C32/sai.profile index e5362a7aef0..3491c7700c2 100644 --- a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C32/sai.profile +++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5232f-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai.profile b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai.profile index 0daed30c3bc..b9703d137bb 100644 --- a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai.profile +++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5232f-8x100G+48x50G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-100G/sai.profile b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-100G/sai.profile index e5362a7aef0..3491c7700c2 100644 --- a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-100G/sai.profile +++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-100G/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5232f-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-10G/sai.profile b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-10G/sai.profile index 947af7ebacc..166a0fa8c8b 100644 --- a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-10G/sai.profile +++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-10G/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5232f-96x10G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-25G/sai.profile b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-25G/sai.profile index ae09492f0e7..0c5cf8ca671 100644 --- a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-25G/sai.profile +++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-P-25G/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5232f-96x25G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/sai.profile b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/sai.profile index 52afc687173..72f420de5d4 100644 --- a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/sai.profile +++ b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-10G/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5248f-10g.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/sai.profile b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/sai.profile index 4753ec3886c..eb9a3cb196f 100644 --- a/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/sai.profile +++ b/device/dell/x86_64-dellemc_s5248f_c3538-r0/DellEMC-S5248f-P-25G/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5248f-25g.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/buffers_defaults_t1.j2 b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/buffers_defaults_t1.j2 index f120b337de0..d538ab1f650 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/buffers_defaults_t1.j2 +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/buffers_defaults_t1.j2 @@ -11,18 +11,13 @@ {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "34859968", + "size": "35621248", "type": "ingress", "mode": "dynamic", "xoff": "7847424" }, - "egress_lossy_pool": { - "size": "29631680", - "type": "egress", - "mode": "dynamic" - }, "egress_lossless_pool": { - "size": "43481152", + "size": "43468672", "type": "egress", "mode": "static" } @@ -35,12 +30,13 @@ }, "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", - "size":"1518", - "static_th":"10870288" + "size":"0", + "static_th":"43468672" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"1518", + "pool":"[BUFFER_POOL|egress_lossless_pool]", + "size":"1518", + "mode":"dynamic", "dynamic_th":"3" } }, diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/sai.profile b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/sai.profile index 0a4fed04175..c6e99b771db 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/sai.profile +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-z9264f-64x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/th2-z9264f-64x100G.config.bcm b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/th2-z9264f-64x100G.config.bcm index fdd3b3fc076..2cc2d055f48 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/th2-z9264f-64x100G.config.bcm +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C64/th2-z9264f-64x100G.config.bcm @@ -8,7 +8,7 @@ fpem_mem_entries=65536 l2xmsg_mode=1 l3_alpm_enable=2 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 @@ -1003,3 +1003,4 @@ dport_map_port_66=65 dport_map_port_100=66 module_64ports=1 +mmu_init_config="MSFT-TH2-Tier1" diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/buffers_defaults_t0.j2 b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/buffers_defaults_t0.j2 index 2b40c3d6ad2..cbbae78d759 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/buffers_defaults_t0.j2 +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/buffers_defaults_t0.j2 @@ -18,18 +18,13 @@ {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "33096128", + "size": "34369920", "type": "ingress", "mode": "dynamic", "xoff": "9098752" }, - "egress_lossy_pool": { - "size": "28132416", - "type": "egress", - "mode": "dynamic" - }, "egress_lossless_pool": { - "size": "43108416", + "size": "43468672", "type": "egress", "mode": "static" } @@ -42,12 +37,13 @@ }, "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", - "size":"1518", - "static_th":"10777104" + "size":"0", + "static_th":"43468672" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", + "mode":"dynamic", "dynamic_th":"3" } }, diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/sai.profile b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/sai.profile index 7bf21827cd1..a6a351387d5 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/sai.profile +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-z9264f-8x100G-112x50G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/th2-z9264f-8x100G-112x50G.config.bcm b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/th2-z9264f-8x100G-112x50G.config.bcm index f4b3addfb51..0c1fabf7c6f 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/th2-z9264f-8x100G-112x50G.config.bcm +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-C8D112/th2-z9264f-8x100G-112x50G.config.bcm @@ -8,7 +8,7 @@ fpem_mem_entries=65536 l2xmsg_mode=1 l3_alpm_enable=2 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 @@ -1115,5 +1115,5 @@ dport_map_port_66=121 dport_map_port_100=122 module_64ports=1 -mmu_init_config="MSFT-TH-Tier0" +mmu_init_config="MSFT-TH2-Tier0" diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t0.j2 b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t0.j2 index c3e8cbda67d..96c99e5800e 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t0.j2 +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t0.j2 @@ -11,18 +11,13 @@ {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "38738752", + "size": "35621248", "type": "ingress", "mode": "dynamic", - "xoff": "3855488" - }, - "egress_lossy_pool": { - "size": "37057280", - "type": "egress", - "mode": "dynamic" + "xoff": "7847424" }, "egress_lossless_pool": { - "size": "43507776", + "size": "43468672", "type": "egress", "mode": "static" } @@ -35,12 +30,13 @@ }, "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", - "size":"1518", - "static_th":"10876944" + "size":"0", + "static_th":"43468672" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", + "mode":"dynamic", "dynamic_th":"3" } }, diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t1.j2 b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t1.j2 index a5322c73272..5710131e528 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t1.j2 +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/buffers_defaults_t1.j2 @@ -11,18 +11,13 @@ {%- macro generate_buffer_pool_and_profiles() %} "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "37968320", + "size": "35621248", "type": "ingress", "mode": "dynamic", - "xoff": "4625920" - }, - "egress_lossy_pool": { - "size": "36402496", - "type": "egress", - "mode": "dynamic" + "xoff": "7847424" }, "egress_lossless_pool": { - "size": "43507776", + "size": "43468672", "type": "egress", "mode": "static" } @@ -35,11 +30,11 @@ }, "egress_lossless_profile": { "pool":"[BUFFER_POOL|egress_lossless_pool]", - "size":"1518", - "static_th":"10876944" + "size":"0", + "static_th":"43468672" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|egress_lossless_pool]", "size":"1518", "dynamic_th":"3" } diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/sai.profile.j2 b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/sai.profile.j2 index 66859a47373..7c6d12b4b17 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/sai.profile.j2 +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/sai.profile.j2 @@ -1,7 +1,7 @@ {# Get sai.profile based on switch_role #} {%- if DEVICE_METADATA is defined -%} {%- set switch_role = DEVICE_METADATA['localhost']['type'] -%} -{%- if switch_role.lower() == 'torrouter' %} +{%- if 'torrouter' in switch_role.lower() %} {% set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-z9264f-64x40G-t0.config.bcm' -%} {%- else %} {%- set sai_profile_contents = 'SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-z9264f-64x40G-t1.config.bcm' -%} @@ -11,3 +11,4 @@ {%- endif %} {# Write the contents of sai_ profile_filename to sai.profile file #} {{ sai_profile_contents }} +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t0.config.bcm b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t0.config.bcm index 79ec519f785..24990bbdb1e 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t0.config.bcm +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t0.config.bcm @@ -8,7 +8,7 @@ fpem_mem_entries=65536 l2xmsg_mode=1 l3_alpm_enable=2 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 @@ -1003,5 +1003,4 @@ dport_map_port_66=65 dport_map_port_100=66 module_64ports=1 - -mmu_init_config="MSFT-TH-Tier0" +mmu_init_config="MSFT-TH2-Tier0" diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t1.config.bcm b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t1.config.bcm index 8551d7b5b14..b3920ebc6b8 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t1.config.bcm +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/DellEMC-Z9264f-Q64/th2-z9264f-64x40G-t1.config.bcm @@ -8,7 +8,7 @@ fpem_mem_entries=65536 l2xmsg_mode=1 l3_alpm_enable=2 -bcm_num_cos=8 +bcm_num_cos=10 switch_bypass_mode=0 mmu_lossless=0 lpm_scaling_enable=0 @@ -1004,4 +1004,4 @@ dport_map_port_100=66 module_64ports=1 -mmu_init_config="MSFT-TH-Tier1" +mmu_init_config="MSFT-TH2-Tier1" diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/eeprom.py b/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/eeprom.py index 2af10473065..ce1691a7294 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/eeprom.py +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/eeprom.py @@ -10,6 +10,7 @@ ############################################################################# try: + import os.path from sonic_eeprom import eeprom_tlvinfo except ImportError, e: raise ImportError (str(e) + "- required module not found") @@ -18,5 +19,13 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): - self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0050/eeprom" + 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) diff --git a/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/sfputil.py b/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/sfputil.py index bb1c961ab67..14c8fe9f4cf 100644 --- a/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dellemc_z9264f_c3538-r0/plugins/sfputil.py @@ -44,6 +44,8 @@ SFP_VOLT_WIDTH = 2 SFP_MODULE_THRESHOLD_OFFSET = 0 SFP_MODULE_THRESHOLD_WIDTH = 56 +SFP_CHANNL_MON_OFFSET = 100 +SFP_CHANNL_MON_WIDTH = 6 XCVR_DOM_CAPABILITY_OFFSET = 92 XCVR_DOM_CAPABILITY_WIDTH = 1 @@ -226,8 +228,8 @@ def reset(self, port_num): if (reg_value == ""): return False - # Mask off 4th bit for presence - mask = (1 << 6) + # Mask off 4th bit for reset + mask = (1 << 4) # ResetL is active low reg_value = reg_value & ~mask @@ -347,7 +349,7 @@ def get_transceiver_dom_info_dict(self, port_num): ] transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') - if port_num in self.qsfp_ports: + if port_num in self.qsfp_ports: offset = 0 offset_xcvr = 128 file_path = self._get_port_eeprom_path(port_num, self.IDENTITY_EEPROM_ADDR) @@ -379,7 +381,7 @@ def get_transceiver_dom_info_dict(self, port_num): return transceiver_dom_info_dict dom_temperature_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: + if dom_temperature_raw is not None: dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) else: return transceiver_dom_info_dict @@ -411,10 +413,22 @@ def get_transceiver_dom_info_dict(self, port_num): else: return transceiver_dom_info_dict - transceiver_dom_info_dict['tx1power'] = 'N/A' + transceiver_dom_info_dict['tx1power'] = 'N/A' transceiver_dom_info_dict['tx2power'] = 'N/A' transceiver_dom_info_dict['tx3power'] = 'N/A' transceiver_dom_info_dict['tx4power'] = 'N/A' + else: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + else: + return None + + transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TX1Power']['value'] + transceiver_dom_info_dict['tx2power'] = dom_channel_monitor_data['data']['TX2Power']['value'] + transceiver_dom_info_dict['tx3power'] = dom_channel_monitor_data['data']['TX3Power']['value'] + transceiver_dom_info_dict['tx4power'] = dom_channel_monitor_data['data']['TX4Power']['value'] + try: sysfsfile_eeprom.close() except IOError: @@ -433,64 +447,66 @@ def get_transceiver_dom_info_dict(self, port_num): transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] else: - offset = 256 - file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) - if not self._sfp_eeprom_present(file_path, 0): - return None - - try: - sysfsfile_eeprom = io.open(file_path,"rb",0) - except IOError: - print("Error: reading sysfs file %s" % file_path) - return None - - sfpd_obj = sff8472Dom(None,1) - if sfpd_obj is None: - return None - dom_temperature_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), - SFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - else: - return transceiver_dom_info_dict - - dom_voltage_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_VOLT_OFFSET), - SFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - else: - return transceiver_dom_info_dict - - dom_channel_monitor_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_MODULE_THRESHOLD_OFFSET), - SFP_MODULE_THRESHOLD_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) - else: - return transceiver_dom_info_dict - - try: - sysfsfile_eeprom.close() - except IOError: - print("Error: closing sysfs file %s" % file_path) - return None - - transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] - transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] - transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RXPower']['value'] - transceiver_dom_info_dict['rx2power'] = 'N/A' - transceiver_dom_info_dict['rx3power'] = 'N/A' - transceiver_dom_info_dict['rx4power'] = 'N/A' - transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TXBias']['value'] - transceiver_dom_info_dict['tx2bias'] = 'N/A' - transceiver_dom_info_dict['tx3bias'] = 'N/A' - transceiver_dom_info_dict['tx4bias'] = 'N/A' - transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TXPower']['value'] - transceiver_dom_info_dict['tx2power'] = 'N/A' - transceiver_dom_info_dict['tx3power'] = 'N/A' - transceiver_dom_info_dict['tx4power'] = 'N/A' - - return transceiver_dom_info_dict - + offset = 256 + file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR) + if not self._sfp_eeprom_present(file_path, 0): + return None + + try: + sysfsfile_eeprom = io.open(file_path,"rb",0) + except IOError: + print("Error: reading sysfs file %s" % file_path) + return None + + sfpd_obj = sff8472Dom(None,1) + if sfpd_obj is None: + return None + dom_temperature_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), + SFP_TEMPE_WIDTH) + + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + else: + return transceiver_dom_info_dict + + dom_voltage_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_VOLT_OFFSET), + SFP_VOLT_WIDTH) + + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + else: + return transceiver_dom_info_dict + + dom_channel_monitor_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + SFP_CHANNL_MON_OFFSET), + SFP_CHANNL_MON_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) + else: + return transceiver_dom_info_dict + + try: + sysfsfile_eeprom.close() + except IOError: + print("Error: closing sysfs file %s" % file_path) + return None + + transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value'] + transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value'] + transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RXPower']['value'] + transceiver_dom_info_dict['rx2power'] = 'N/A' + transceiver_dom_info_dict['rx3power'] = 'N/A' + transceiver_dom_info_dict['rx4power'] = 'N/A' + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TXBias']['value'] + transceiver_dom_info_dict['tx2bias'] = 'N/A' + transceiver_dom_info_dict['tx3bias'] = 'N/A' + transceiver_dom_info_dict['tx4bias'] = 'N/A' + transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TXPower']['value'] + transceiver_dom_info_dict['tx2power'] = 'N/A' + transceiver_dom_info_dict['tx3power'] = 'N/A' + transceiver_dom_info_dict['tx4power'] = 'N/A' + + return transceiver_dom_info_dict + def get_transceiver_dom_threshold_info_dict(self, port_num): transceiver_dom_threshold_info_dict = {} dom_info_dict_keys = ['temphighalarm', 'temphighwarning', diff --git a/device/delta/x86_64-delta_ag5648-r0/Delta-ag5648/sai.profile b/device/delta/x86_64-delta_ag5648-r0/Delta-ag5648/sai.profile index 094e2d2cda0..98876a9c2a3 100644 --- a/device/delta/x86_64-delta_ag5648-r0/Delta-ag5648/sai.profile +++ b/device/delta/x86_64-delta_ag5648-r0/Delta-ag5648/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-ag5648-48x25G+6x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile b/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile index c77b2bf79a3..a1ec3ca258d 100644 --- a/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile +++ b/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-ag9032v1-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/sai.profile b/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/sai.profile index f0eccb02825..0d3c85f8f38 100644 --- a/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/sai.profile +++ b/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-ag9032v2a-32x100G+1x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/td3-ag9032v2a-32x100G+1x10G.config.bcm b/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/td3-ag9032v2a-32x100G+1x10G.config.bcm index 4c6ceb075bf..2cef2f4261a 100755 --- a/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/td3-ag9032v2a-32x100G+1x10G.config.bcm +++ b/device/delta/x86_64-delta_ag9032v2a-r0/Delta-ag9032v2a/td3-ag9032v2a-32x100G+1x10G.config.bcm @@ -9,7 +9,7 @@ l2_mem_entries=32768 l3_mem_entries=16384 fpem_mem_entries=131072 l2xmsg_mode=1 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 ipv6_lpm_128b_enable=0x1 diff --git a/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/sai.profile b/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/sai.profile index 21f013773e6..2fc46808b55 100644 --- a/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/sai.profile +++ b/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-ag9064-64x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm b/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm index eae7278a3ab..4aba9cc855a 100644 --- a/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm +++ b/device/delta/x86_64-delta_ag9064-r0/Delta-ag9064/th2-ag9064-64x100G.config.bcm @@ -781,7 +781,7 @@ portmap_8=29:100 portmap_9=33:100 lpm_scaling_enable=0 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_jumbo=9236 ipv6_lpm_128b_enable=1 max_vp_lags=0 diff --git a/device/delta/x86_64-delta_et-6248brb-r0/Delta-et-6248brb/sai.profile b/device/delta/x86_64-delta_et-6248brb-r0/Delta-et-6248brb/sai.profile index 726e1b6dc66..20e067d8eda 100644 --- a/device/delta/x86_64-delta_et-6248brb-r0/Delta-et-6248brb/sai.profile +++ b/device/delta/x86_64-delta_et-6248brb-r0/Delta-et-6248brb/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/helix4-et-6248brb-48x1G+2x10G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 index 4fca9cbcd15..93dac6b1992 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 32 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml index 2ba23d2a5a6..424b4a83ce2 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_A" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -280,20 +283,6 @@ nodes: speed: "400G" sysport: "9" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" tx_polarity: "01010101" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/ivm.sai.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/ivm.sai.config.yaml new file mode 100755 index 00000000000..b897ed8fcc6 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/pg_profile_lookup.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini index 360e363f485..64d07a4eecd 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini @@ -1,35 +1,33 @@ -# name lanes speed index mtu fec -Ethernet0 249,250,251,252 400000 0 9126 rs -Ethernet8 241,242,243,244 400000 1 9126 rs -Ethernet16 233,234,235,236 400000 2 9126 rs -Ethernet24 225,226,227,228 400000 3 9126 rs -Ethernet32 217,218,219,220 400000 4 9126 rs -Ethernet40 209,210,211,212 400000 5 9126 rs -Ethernet48 201,202,203,204 400000 6 9126 rs -Ethernet56 193,194,195,196 400000 7 9126 rs -Ethernet64 185,186,187,188 400000 8 9126 rs -Ethernet72 177,178,179,180 400000 9 9126 rs -Ethernet80 169,170,171,172 400000 10 9126 rs -Ethernet88 161,162,163,164 400000 11 9126 rs -Ethernet96 153,154,155,156 400000 12 9126 rs -Ethernet104 145,146,147,148 400000 13 9126 rs -Ethernet112 137,138,139,140 400000 14 9126 rs -Ethernet120 129,130,131,132 400000 15 9126 rs -Ethernet128 121,122,123,124 400000 16 9126 rs -Ethernet136 113,114,115,116 400000 17 9126 rs -Ethernet144 97,98,99,100 400000 18 9126 rs -Ethernet152 105,106,107,108 400000 19 9126 rs -Ethernet160 81,82,83,84 400000 20 9126 rs -Ethernet168 89,90,91,92 400000 21 9126 rs -Ethernet176 65,66,67,68 400000 22 9126 rs -Ethernet184 73,74,75,76 400000 23 9126 rs -Ethernet192 49,50,51,52 400000 24 9126 rs -Ethernet200 57,58,59,60 400000 25 9126 rs -Ethernet208 33,34,35,36 400000 26 9126 rs -Ethernet216 41,42,43,44 400000 27 9126 rs -Ethernet224 17,18,19,20 400000 28 9126 rs -Ethernet232 25,26,27,28 400000 29 9126 rs -Ethernet240 1,2,3,4 400000 30 9126 rs -Ethernet248 9,10,11,12 400000 31 9126 rs -Ethernet256 257 10000 32 9126 none -Ethernet257 258 10000 33 9126 none +# name lanes alias speed index mtu fec +Ethernet0 249,250,251,252,253,254,255,256 Ethernet0 400000 0 9126 rs +Ethernet8 241,242,243,244,245,246,247,248 Ethernet8 400000 1 9126 rs +Ethernet16 233,234,235,236,237,238,239,240 Ethernet16 400000 2 9126 rs +Ethernet24 225,226,227,228,229,230,231,232 Ethernet24 400000 3 9126 rs +Ethernet32 217,218,219,220,221,222,223,224 Ethernet32 400000 4 9126 rs +Ethernet40 209,210,211,212,213,214,215,216 Ethernet40 400000 5 9126 rs +Ethernet48 201,202,203,204,205,206,207,208 Ethernet48 400000 6 9126 rs +Ethernet56 193,194,195,196,197,198,199,200 Ethernet56 400000 7 9126 rs +Ethernet64 185,186,187,188,189,190,191,192 Ethernet64 400000 8 9126 rs +Ethernet72 177,178,179,180,181,182,183,184 Ethernet72 400000 9 9126 rs +Ethernet80 169,170,171,172,173,174,175,176 Ethernet80 400000 10 9126 rs +Ethernet88 161,162,163,164,165,166,167,168 Ethernet88 400000 11 9126 rs +Ethernet96 153,154,155,156,157,158,159,160 Ethernet96 400000 12 9126 rs +Ethernet104 145,146,147,148,149,150,151,152 Ethernet104 400000 13 9126 rs +Ethernet112 137,138,139,140,141,142,143,144 Ethernet112 400000 14 9126 rs +Ethernet120 129,130,131,132,133,134,135,136 Ethernet120 400000 15 9126 rs +Ethernet128 121,122,123,124,125,126,127,128 Ethernet128 400000 16 9126 rs +Ethernet136 113,114,115,116,117,118,119,120 Ethernet136 400000 17 9126 rs +Ethernet144 97,98,99,100,101,102,103,104 Ethernet144 400000 18 9126 rs +Ethernet152 105,106,107,108,109,110,111,112 Ethernet152 400000 19 9126 rs +Ethernet160 81,82,83,84,85,86,87,88 Ethernet160 400000 20 9126 rs +Ethernet168 89,90,91,92,93,94,95,96 Ethernet168 400000 21 9126 rs +Ethernet176 65,66,67,68,69,70,71,72 Ethernet176 400000 22 9126 rs +Ethernet184 73,74,75,76,77,78,79,80 Ethernet184 400000 23 9126 rs +Ethernet192 49,50,51,52,53,54,55,56 Ethernet192 400000 24 9126 rs +Ethernet200 57,58,59,60,61,62,63,64 Ethernet200 400000 25 9126 rs +Ethernet208 33,34,35,36,37,38,39,40 Ethernet208 400000 26 9126 rs +Ethernet216 41,42,43,44,45,46,47,48 Ethernet216 400000 27 9126 rs +Ethernet224 17,18,19,20,21,22,23,24 Ethernet224 400000 28 9126 rs +Ethernet232 25,26,27,28,29,30,31,32 Ethernet232 400000 29 9126 rs +Ethernet240 1,2,3,4,5,6,7,8 Ethernet240 400000 30 9126 rs +Ethernet248 9,10,11,12,13,14,15,16 Ethernet248 400000 31 9126 rs diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 index 6c734d46ff2..4b9748c7b59 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 32 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 index 9529fbf52fb..93dac6b1992 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 128 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml index ad50fd04c2a..16a237eb600 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -952,20 +955,6 @@ nodes: speed: "100G" sysport: "15" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/ivm.sai.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..f637b395a90 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_128x100G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/pg_profile_lookup.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini index cd4dbc611ec..271caf81886 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini @@ -1,131 +1,129 @@ -# name lanes speed index mtu -Ethernet0 249,250 100000 0 9126 -Ethernet2 251,252 100000 0 9126 -Ethernet4 253,254 100000 0 9126 -Ethernet6 255,256 100000 0 9126 -Ethernet8 241,242 100000 1 9126 -Ethernet10 243,244 100000 1 9126 -Ethernet12 245,246 100000 1 9126 -Ethernet14 247,248 100000 1 9126 -Ethernet16 233,234 100000 2 9126 -Ethernet18 235,236 100000 2 9126 -Ethernet20 237,238 100000 2 9126 -Ethernet22 239,240 100000 2 9126 -Ethernet24 225,226 100000 3 9126 -Ethernet26 227,228 100000 3 9126 -Ethernet28 229,230 100000 3 9126 -Ethernet30 231,232 100000 3 9126 -Ethernet32 217,218 100000 4 9126 -Ethernet34 219,220 100000 4 9126 -Ethernet36 221,222 100000 4 9126 -Ethernet38 223,224 100000 4 9126 -Ethernet40 209,210 100000 5 9126 -Ethernet42 211,212 100000 5 9126 -Ethernet44 213,214 100000 5 9126 -Ethernet46 215,216 100000 5 9126 -Ethernet48 201,202 100000 6 9126 -Ethernet50 203,204 100000 6 9126 -Ethernet52 205,206 100000 6 9126 -Ethernet54 207,208 100000 6 9126 -Ethernet56 193,194 100000 7 9126 -Ethernet58 195,196 100000 7 9126 -Ethernet60 197,198 100000 7 9126 -Ethernet62 199,200 100000 7 9126 -Ethernet64 185,186 100000 8 9126 -Ethernet66 187,188 100000 8 9126 -Ethernet68 189,190 100000 8 9126 -Ethernet70 191,192 100000 8 9126 -Ethernet72 177,178 100000 9 9126 -Ethernet74 179,180 100000 9 9126 -Ethernet76 181,182 100000 9 9126 -Ethernet78 183,184 100000 9 9126 -Ethernet80 169,170 100000 10 9126 -Ethernet82 171,172 100000 10 9126 -Ethernet84 173,174 100000 10 9126 -Ethernet86 175,176 100000 10 9126 -Ethernet88 161,162 100000 11 9126 -Ethernet90 163,164 100000 11 9126 -Ethernet92 165,166 100000 11 9126 -Ethernet94 167,168 100000 11 9126 -Ethernet96 153,154 100000 12 9126 -Ethernet98 155,156 100000 12 9126 -Ethernet100 157,158 100000 12 9126 -Ethernet102 159,160 100000 12 9126 -Ethernet104 145,146 100000 13 9126 -Ethernet106 147,148 100000 13 9126 -Ethernet108 149,150 100000 13 9126 -Ethernet110 151,152 100000 13 9126 -Ethernet112 137,138 100000 14 9126 -Ethernet114 139,140 100000 14 9126 -Ethernet116 141,142 100000 14 9126 -Ethernet118 143,144 100000 14 9126 -Ethernet120 129,130 100000 15 9126 -Ethernet122 131,132 100000 15 9126 -Ethernet124 133,134 100000 15 9126 -Ethernet126 135,136 100000 15 9126 -Ethernet128 121,122 100000 16 9126 -Ethernet130 123,124 100000 16 9126 -Ethernet132 125,126 100000 16 9126 -Ethernet134 127,128 100000 16 9126 -Ethernet136 113,114 100000 17 9126 -Ethernet138 115,116 100000 17 9126 -Ethernet140 117,118 100000 17 9126 -Ethernet142 119,120 100000 17 9126 -Ethernet144 97,98 100000 18 9126 -Ethernet146 99,100 100000 18 9126 -Ethernet148 101,102 100000 18 9126 -Ethernet150 103,104 100000 18 9126 -Ethernet152 105,106 100000 19 9126 -Ethernet154 107,108 100000 19 9126 -Ethernet156 109,110 100000 19 9126 -Ethernet158 111,112 100000 19 9126 -Ethernet160 81,82 100000 20 9126 -Ethernet162 83,84 100000 20 9126 -Ethernet164 85,86 100000 20 9126 -Ethernet166 87,88 100000 20 9126 -Ethernet168 89,90 100000 21 9126 -Ethernet170 91,92 100000 21 9126 -Ethernet172 93,94 100000 21 9126 -Ethernet174 95,96 100000 21 9126 -Ethernet176 65,66 100000 22 9126 -Ethernet178 67,68 100000 22 9126 -Ethernet180 69,70 100000 22 9126 -Ethernet182 71,72 100000 22 9126 -Ethernet184 73,74 100000 23 9126 -Ethernet186 75,76 100000 23 9126 -Ethernet188 77,78 100000 23 9126 -Ethernet190 79,80 100000 23 9126 -Ethernet192 49,50 100000 24 9126 -Ethernet194 51,52 100000 24 9126 -Ethernet196 53,54 100000 24 9126 -Ethernet198 55,56 100000 24 9126 -Ethernet200 57,58 100000 25 9126 -Ethernet202 59,60 100000 25 9126 -Ethernet204 61,62 100000 25 9126 -Ethernet206 63,64 100000 25 9126 -Ethernet208 33,34 100000 26 9126 -Ethernet210 35,36 100000 26 9126 -Ethernet212 37,38 100000 26 9126 -Ethernet214 39,40 100000 26 9126 -Ethernet216 41,42 100000 27 9126 -Ethernet218 43,44 100000 27 9126 -Ethernet220 45,46 100000 27 9126 -Ethernet222 47,48 100000 27 9126 -Ethernet224 17,18 100000 28 9126 -Ethernet226 19,20 100000 28 9126 -Ethernet228 21,22 100000 28 9126 -Ethernet230 23,24 100000 28 9126 -Ethernet232 25,26 100000 29 9126 -Ethernet234 27,28 100000 29 9126 -Ethernet236 29,30 100000 29 9126 -Ethernet238 31,32 100000 29 9126 -Ethernet240 1,2 100000 30 9126 -Ethernet242 3,4 100000 30 9126 -Ethernet244 5,6 100000 30 9126 -Ethernet246 7,8 100000 30 9126 -Ethernet248 9,10 100000 31 9126 -Ethernet250 11,12 100000 31 9126 -Ethernet252 13,14 100000 31 9126 -Ethernet254 15,16 100000 31 9126 -Ethernet256 257 10000 32 9126 -Ethernet257 258 10000 33 9126 +# name lanes alias speed index mtu +Ethernet0 249,250 Eth1/1 100000 0 9126 +Ethernet2 251,252 Eth1/2 100000 0 9126 +Ethernet4 253,254 Eth1/3 100000 0 9126 +Ethernet6 255,256 Eth1/4 100000 0 9126 +Ethernet8 241,242 Eth2/1 100000 1 9126 +Ethernet10 243,244 Eth2/2 100000 1 9126 +Ethernet12 245,246 Eth2/3 100000 1 9126 +Ethernet14 247,248 Eth2/4 100000 1 9126 +Ethernet16 233,234 Eth3/1 100000 2 9126 +Ethernet18 235,236 Eth3/2 100000 2 9126 +Ethernet20 237,238 Eth3/3 100000 2 9126 +Ethernet22 239,240 Eth3/4 100000 2 9126 +Ethernet24 225,226 Eth4/1 100000 3 9126 +Ethernet26 227,228 Eth4/2 100000 3 9126 +Ethernet28 229,230 Eth4/3 100000 3 9126 +Ethernet30 231,232 Eth4/4 100000 3 9126 +Ethernet32 217,218 Eth5/1 100000 4 9126 +Ethernet34 219,220 Eth5/2 100000 4 9126 +Ethernet36 221,222 Eth5/3 100000 4 9126 +Ethernet38 223,224 Eth5/4 100000 4 9126 +Ethernet40 209,210 Eth6/1 100000 5 9126 +Ethernet42 211,212 Eth6/2 100000 5 9126 +Ethernet44 213,214 Eth6/3 100000 5 9126 +Ethernet46 215,216 Eth6/4 100000 5 9126 +Ethernet48 201,202 Eth7/1 100000 6 9126 +Ethernet50 203,204 Eth7/2 100000 6 9126 +Ethernet52 205,206 Eth7/3 100000 6 9126 +Ethernet54 207,208 Eth7/4 100000 6 9126 +Ethernet56 193,194 Eth8/1 100000 7 9126 +Ethernet58 195,196 Eth8/2 100000 7 9126 +Ethernet60 197,198 Eth8/3 100000 7 9126 +Ethernet62 199,200 Eth8/4 100000 7 9126 +Ethernet64 185,186 Eth9/1 100000 8 9126 +Ethernet66 187,188 Eth9/2 100000 8 9126 +Ethernet68 189,190 Eth9/3 100000 8 9126 +Ethernet70 191,192 Eth9/4 100000 8 9126 +Ethernet72 177,178 Eth10/1 100000 9 9126 +Ethernet74 179,180 Eth10/2 100000 9 9126 +Ethernet76 181,182 Eth10/3 100000 9 9126 +Ethernet78 183,184 Eth10/4 100000 9 9126 +Ethernet80 169,170 Eth11/1 100000 10 9126 +Ethernet82 171,172 Eth11/2 100000 10 9126 +Ethernet84 173,174 Eth11/3 100000 10 9126 +Ethernet86 175,176 Eth11/4 100000 10 9126 +Ethernet88 161,162 Eth12/1 100000 11 9126 +Ethernet90 163,164 Eth12/2 100000 11 9126 +Ethernet92 165,166 Eth12/3 100000 11 9126 +Ethernet94 167,168 Eth12/4 100000 11 9126 +Ethernet96 153,154 Eth13/1 100000 12 9126 +Ethernet98 155,156 Eth13/2 100000 12 9126 +Ethernet100 157,158 Eth13/3 100000 12 9126 +Ethernet102 159,160 Eth13/4 100000 12 9126 +Ethernet104 145,146 Eth14/1 100000 13 9126 +Ethernet106 147,148 Eth14/2 100000 13 9126 +Ethernet108 149,150 Eth14/3 100000 13 9126 +Ethernet110 151,152 Eth14/4 100000 13 9126 +Ethernet112 137,138 Eth15/1 100000 14 9126 +Ethernet114 139,140 Eth15/2 100000 14 9126 +Ethernet116 141,142 Eth15/3 100000 14 9126 +Ethernet118 143,144 Eth15/4 100000 14 9126 +Ethernet120 129,130 Eth16/1 100000 15 9126 +Ethernet122 131,132 Eth16/2 100000 15 9126 +Ethernet124 133,134 Eth16/3 100000 15 9126 +Ethernet126 135,136 Eth16/4 100000 15 9126 +Ethernet128 121,122 Eth17/1 100000 16 9126 +Ethernet130 123,124 Eth17/2 100000 16 9126 +Ethernet132 125,126 Eth17/3 100000 16 9126 +Ethernet134 127,128 Eth17/4 100000 16 9126 +Ethernet136 113,114 Eth18/1 100000 17 9126 +Ethernet138 115,116 Eth18/2 100000 17 9126 +Ethernet140 117,118 Eth18/3 100000 17 9126 +Ethernet142 119,120 Eth18/4 100000 17 9126 +Ethernet144 97,98 Eth19/1 100000 18 9126 +Ethernet146 99,100 Eth19/2 100000 18 9126 +Ethernet148 101,102 Eth19/3 100000 18 9126 +Ethernet150 103,104 Eth19/4 100000 18 9126 +Ethernet152 105,106 Eth20/1 100000 19 9126 +Ethernet154 107,108 Eth20/2 100000 19 9126 +Ethernet156 109,110 Eth20/3 100000 19 9126 +Ethernet158 111,112 Eth20/4 100000 19 9126 +Ethernet160 81,82 Eth21/1 100000 20 9126 +Ethernet162 83,84 Eth21/2 100000 20 9126 +Ethernet164 85,86 Eth21/3 100000 20 9126 +Ethernet166 87,88 Eth21/4 100000 20 9126 +Ethernet168 89,90 Eth22/1 100000 21 9126 +Ethernet170 91,92 Eth22/2 100000 21 9126 +Ethernet172 93,94 Eth22/3 100000 21 9126 +Ethernet174 95,96 Eth22/4 100000 21 9126 +Ethernet176 65,66 Eth23/1 100000 22 9126 +Ethernet178 67,68 Eth23/2 100000 22 9126 +Ethernet180 69,70 Eth23/3 100000 22 9126 +Ethernet182 71,72 Eth23/4 100000 22 9126 +Ethernet184 73,74 Eth24/1 100000 23 9126 +Ethernet186 75,76 Eth24/2 100000 23 9126 +Ethernet188 77,78 Eth24/3 100000 23 9126 +Ethernet190 79,80 Eth24/4 100000 23 9126 +Ethernet192 49,50 Eth25/1 100000 24 9126 +Ethernet194 51,52 Eth25/2 100000 24 9126 +Ethernet196 53,54 Eth25/3 100000 24 9126 +Ethernet198 55,56 Eth25/4 100000 24 9126 +Ethernet200 57,58 Eth26/1 100000 25 9126 +Ethernet202 59,60 Eth26/2 100000 25 9126 +Ethernet204 61,62 Eth26/3 100000 25 9126 +Ethernet206 63,64 Eth26/4 100000 25 9126 +Ethernet208 33,34 Eth27/1 100000 26 9126 +Ethernet210 35,36 Eth27/2 100000 26 9126 +Ethernet212 37,38 Eth27/3 100000 26 9126 +Ethernet214 39,40 Eth27/4 100000 26 9126 +Ethernet216 41,42 Eth28/1 100000 27 9126 +Ethernet218 43,44 Eth28/2 100000 27 9126 +Ethernet220 45,46 Eth28/3 100000 27 9126 +Ethernet222 47,48 Eth28/4 100000 27 9126 +Ethernet224 17,18 Eth29/1 100000 28 9126 +Ethernet226 19,20 Eth29/2 100000 28 9126 +Ethernet228 21,22 Eth29/3 100000 28 9126 +Ethernet230 23,24 Eth29/4 100000 28 9126 +Ethernet232 25,26 Eth30/1 100000 29 9126 +Ethernet234 27,28 Eth30/2 100000 29 9126 +Ethernet236 29,30 Eth30/3 100000 29 9126 +Ethernet238 31,32 Eth30/4 100000 29 9126 +Ethernet240 1,2 Eth31/1 100000 30 9126 +Ethernet242 3,4 Eth31/2 100000 30 9126 +Ethernet244 5,6 Eth31/3 100000 30 9126 +Ethernet246 7,8 Eth31/4 100000 30 9126 +Ethernet248 9,10 Eth32/1 100000 31 9126 +Ethernet250 11,12 Eth32/2 100000 31 9126 +Ethernet252 13,14 Eth32/3 100000 31 9126 +Ethernet254 15,16 Eth32/4 100000 31 9126 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 index 733bd51dc86..4b9748c7b59 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 128 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 index 4fca9cbcd15..93dac6b1992 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 32 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml index 4b4f02da489..09719ec15c3 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/ivm.sai.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..cddcc2214ee --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/pg_profile_lookup.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini index 45fbfd346c9..f905242d9a0 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini @@ -1,33 +1,33 @@ -# name lanes speed index mtu fec -Ethernet0 249,250,251,252 100000 0 9126 rs -Ethernet8 241,242,243,244 100000 1 9126 rs -Ethernet16 233,234,235,236 100000 2 9126 rs -Ethernet24 225,226,227,228 100000 3 9126 rs -Ethernet32 217,218,219,220 100000 4 9126 rs -Ethernet40 209,210,211,212 100000 5 9126 rs -Ethernet48 201,202,203,204 100000 6 9126 rs -Ethernet56 193,194,195,196 100000 7 9126 rs -Ethernet64 185,186,187,188 100000 8 9126 rs -Ethernet72 177,178,179,180 100000 9 9126 rs -Ethernet80 169,170,171,172 100000 10 9126 rs -Ethernet88 161,162,163,164 100000 11 9126 rs -Ethernet96 153,154,155,156 100000 12 9126 rs -Ethernet104 145,146,147,148 100000 13 9126 rs -Ethernet112 137,138,139,140 100000 14 9126 rs -Ethernet120 129,130,131,132 100000 15 9126 rs -Ethernet128 121,122,123,124 100000 16 9126 rs -Ethernet136 113,114,115,116 100000 17 9126 rs -Ethernet144 97,98,99,100 100000 18 9126 rs -Ethernet152 105,106,107,108 100000 19 9126 rs -Ethernet160 81,82,83,84 100000 20 9126 rs -Ethernet168 89,90,91,92 100000 21 9126 rs -Ethernet176 65,66,67,68 100000 22 9126 rs -Ethernet184 73,74,75,76 100000 23 9126 rs -Ethernet192 49,50,51,52 100000 24 9126 rs -Ethernet200 57,58,59,60 100000 25 9126 rs -Ethernet208 33,34,35,36 100000 26 9126 rs -Ethernet216 41,42,43,44 100000 27 9126 rs -Ethernet224 17,18,19,20 100000 28 9126 rs -Ethernet232 25,26,27,28 100000 29 9126 rs -Ethernet240 1,2,3,4 100000 30 9126 rs -Ethernet248 9,10,11,12 100000 31 9126 rs +# name lanes alias speed index mtu fec +Ethernet0 249,250,251,252 Eth1 100000 0 9126 rs +Ethernet8 241,242,243,244 Eth2 100000 1 9126 rs +Ethernet16 233,234,235,236 Eth3 100000 2 9126 rs +Ethernet24 225,226,227,228 Eth4 100000 3 9126 rs +Ethernet32 217,218,219,220 Eth5 100000 4 9126 rs +Ethernet40 209,210,211,212 Eth6 100000 5 9126 rs +Ethernet48 201,202,203,204 Eth7 100000 6 9126 rs +Ethernet56 193,194,195,196 Eth8 100000 7 9126 rs +Ethernet64 185,186,187,188 Eth9 100000 8 9126 rs +Ethernet72 177,178,179,180 Eth10 100000 9 9126 rs +Ethernet80 169,170,171,172 Eth11 100000 10 9126 rs +Ethernet88 161,162,163,164 Eth12 100000 11 9126 rs +Ethernet96 153,154,155,156 Eth13 100000 12 9126 rs +Ethernet104 145,146,147,148 Eth14 100000 13 9126 rs +Ethernet112 137,138,139,140 Eth15 100000 14 9126 rs +Ethernet120 129,130,131,132 Eth16 100000 15 9126 rs +Ethernet128 121,122,123,124 Eth17 100000 16 9126 rs +Ethernet136 113,114,115,116 Eth18 100000 17 9126 rs +Ethernet144 97,98,99,100 Eth19 100000 18 9126 rs +Ethernet152 105,106,107,108 Eth20 100000 19 9126 rs +Ethernet160 81,82,83,84 Eth21 100000 20 9126 rs +Ethernet168 89,90,91,92 Eth22 100000 21 9126 rs +Ethernet176 65,66,67,68 Eth23 100000 22 9126 rs +Ethernet184 73,74,75,76 Eth24 100000 23 9126 rs +Ethernet192 49,50,51,52 Eth25 100000 24 9126 rs +Ethernet200 57,58,59,60 Eth26 100000 25 9126 rs +Ethernet208 33,34,35,36 Eth27 100000 26 9126 rs +Ethernet216 41,42,43,44 Eth28 100000 27 9126 rs +Ethernet224 17,18,19,20 Eth29 100000 28 9126 rs +Ethernet232 25,26,27,28 Eth30 100000 29 9126 rs +Ethernet240 1,2,3,4 Eth31 100000 30 9126 rs +Ethernet248 9,10,11,12 Eth32 100000 31 9126 rs diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 index 6c734d46ff2..4b9748c7b59 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 32 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 index 4fca9cbcd15..93dac6b1992 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 32 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml index 0a76811110e..bdd09d1f3f0 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -280,20 +283,6 @@ nodes: speed: "200G" sysport: "9" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" tx_polarity: "01010101" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/ivm.sai.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/ivm.sai.config.yaml new file mode 100755 index 00000000000..7f968fbb40f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x200G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/pg_profile_lookup.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini index 48091f5e367..f5dbb41e45c 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini @@ -1,35 +1,33 @@ -# name lanes speed index mtu fec -Ethernet0 249,250,251,252 200000 0 9126 rs -Ethernet8 241,242,243,244 200000 1 9126 rs -Ethernet16 233,234,235,236 200000 2 9126 rs -Ethernet24 225,226,227,228 200000 3 9126 rs -Ethernet32 217,218,219,220 200000 4 9126 rs -Ethernet40 209,210,211,212 200000 5 9126 rs -Ethernet48 201,202,203,204 200000 6 9126 rs -Ethernet56 193,194,195,196 200000 7 9126 rs -Ethernet64 185,186,187,188 200000 8 9126 rs -Ethernet72 177,178,179,180 200000 9 9126 rs -Ethernet80 169,170,171,172 200000 10 9126 rs -Ethernet88 161,162,163,164 200000 11 9126 rs -Ethernet96 153,154,155,156 200000 12 9126 rs -Ethernet104 145,146,147,148 200000 13 9126 rs -Ethernet112 137,138,139,140 200000 14 9126 rs -Ethernet120 129,130,131,132 200000 15 9126 rs -Ethernet128 121,122,123,124 200000 16 9126 rs -Ethernet136 113,114,115,116 200000 17 9126 rs -Ethernet144 97,98,99,100 200000 18 9126 rs -Ethernet152 105,106,107,108 200000 19 9126 rs -Ethernet160 81,82,83,84 200000 20 9126 rs -Ethernet168 89,90,91,92 200000 21 9126 rs -Ethernet176 65,66,67,68 200000 22 9126 rs -Ethernet184 73,74,75,76 200000 23 9126 rs -Ethernet192 49,50,51,52 200000 24 9126 rs -Ethernet200 57,58,59,60 200000 25 9126 rs -Ethernet208 33,34,35,36 200000 26 9126 rs -Ethernet216 41,42,43,44 200000 27 9126 rs -Ethernet224 17,18,19,20 200000 28 9126 rs -Ethernet232 25,26,27,28 200000 29 9126 rs -Ethernet240 1,2,3,4 200000 30 9126 rs -Ethernet248 9,10,11,12 200000 31 9126 rs -Ethernet256 257 10000 32 9126 none -Ethernet257 258 10000 33 9126 none +# name lanes alias speed index mtu fec +Ethernet0 249,250,251,252 Eth1 200000 0 9126 rs +Ethernet8 241,242,243,244 Eth2 200000 1 9126 rs +Ethernet16 233,234,235,236 Eth3 200000 2 9126 rs +Ethernet24 225,226,227,228 Eth4 200000 3 9126 rs +Ethernet32 217,218,219,220 Eth5 200000 4 9126 rs +Ethernet40 209,210,211,212 Eth6 200000 5 9126 rs +Ethernet48 201,202,203,204 Eth7 200000 6 9126 rs +Ethernet56 193,194,195,196 Eth8 200000 7 9126 rs +Ethernet64 185,186,187,188 Eth9 200000 8 9126 rs +Ethernet72 177,178,179,180 Eth10 200000 9 9126 rs +Ethernet80 169,170,171,172 Eth11 200000 10 9126 rs +Ethernet88 161,162,163,164 Eth12 200000 11 9126 rs +Ethernet96 153,154,155,156 Eth13 200000 12 9126 rs +Ethernet104 145,146,147,148 Eth14 200000 13 9126 rs +Ethernet112 137,138,139,140 Eth15 200000 14 9126 rs +Ethernet120 129,130,131,132 Eth16 200000 15 9126 rs +Ethernet128 121,122,123,124 Eth17 200000 16 9126 rs +Ethernet136 113,114,115,116 Eth18 200000 17 9126 rs +Ethernet144 97,98,99,100 Eth19 200000 18 9126 rs +Ethernet152 105,106,107,108 Eth20 200000 19 9126 rs +Ethernet160 81,82,83,84 Eth21 200000 20 9126 rs +Ethernet168 89,90,91,92 Eth22 200000 21 9126 rs +Ethernet176 65,66,67,68 Eth23 200000 22 9126 rs +Ethernet184 73,74,75,76 Eth24 200000 23 9126 rs +Ethernet192 49,50,51,52 Eth25 200000 24 9126 rs +Ethernet200 57,58,59,60 Eth26 200000 25 9126 rs +Ethernet208 33,34,35,36 Eth27 200000 26 9126 rs +Ethernet216 41,42,43,44 Eth28 200000 27 9126 rs +Ethernet224 17,18,19,20 Eth29 200000 28 9126 rs +Ethernet232 25,26,27,28 Eth30 200000 29 9126 rs +Ethernet240 1,2,3,4 Eth31 200000 30 9126 rs +Ethernet248 9,10,11,12 Eth32 200000 31 9126 rs diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 index 6c734d46ff2..4b9748c7b59 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 32 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 index 4fca9cbcd15..93dac6b1992 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 32 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml index 2ba23d2a5a6..424b4a83ce2 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_A" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -280,20 +283,6 @@ nodes: speed: "400G" sysport: "9" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" tx_polarity: "01010101" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/ivm.sai.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/ivm.sai.config.yaml new file mode 100755 index 00000000000..b897ed8fcc6 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/pg_profile_lookup.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini index 360e363f485..64d07a4eecd 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini @@ -1,35 +1,33 @@ -# name lanes speed index mtu fec -Ethernet0 249,250,251,252 400000 0 9126 rs -Ethernet8 241,242,243,244 400000 1 9126 rs -Ethernet16 233,234,235,236 400000 2 9126 rs -Ethernet24 225,226,227,228 400000 3 9126 rs -Ethernet32 217,218,219,220 400000 4 9126 rs -Ethernet40 209,210,211,212 400000 5 9126 rs -Ethernet48 201,202,203,204 400000 6 9126 rs -Ethernet56 193,194,195,196 400000 7 9126 rs -Ethernet64 185,186,187,188 400000 8 9126 rs -Ethernet72 177,178,179,180 400000 9 9126 rs -Ethernet80 169,170,171,172 400000 10 9126 rs -Ethernet88 161,162,163,164 400000 11 9126 rs -Ethernet96 153,154,155,156 400000 12 9126 rs -Ethernet104 145,146,147,148 400000 13 9126 rs -Ethernet112 137,138,139,140 400000 14 9126 rs -Ethernet120 129,130,131,132 400000 15 9126 rs -Ethernet128 121,122,123,124 400000 16 9126 rs -Ethernet136 113,114,115,116 400000 17 9126 rs -Ethernet144 97,98,99,100 400000 18 9126 rs -Ethernet152 105,106,107,108 400000 19 9126 rs -Ethernet160 81,82,83,84 400000 20 9126 rs -Ethernet168 89,90,91,92 400000 21 9126 rs -Ethernet176 65,66,67,68 400000 22 9126 rs -Ethernet184 73,74,75,76 400000 23 9126 rs -Ethernet192 49,50,51,52 400000 24 9126 rs -Ethernet200 57,58,59,60 400000 25 9126 rs -Ethernet208 33,34,35,36 400000 26 9126 rs -Ethernet216 41,42,43,44 400000 27 9126 rs -Ethernet224 17,18,19,20 400000 28 9126 rs -Ethernet232 25,26,27,28 400000 29 9126 rs -Ethernet240 1,2,3,4 400000 30 9126 rs -Ethernet248 9,10,11,12 400000 31 9126 rs -Ethernet256 257 10000 32 9126 none -Ethernet257 258 10000 33 9126 none +# name lanes alias speed index mtu fec +Ethernet0 249,250,251,252,253,254,255,256 Ethernet0 400000 0 9126 rs +Ethernet8 241,242,243,244,245,246,247,248 Ethernet8 400000 1 9126 rs +Ethernet16 233,234,235,236,237,238,239,240 Ethernet16 400000 2 9126 rs +Ethernet24 225,226,227,228,229,230,231,232 Ethernet24 400000 3 9126 rs +Ethernet32 217,218,219,220,221,222,223,224 Ethernet32 400000 4 9126 rs +Ethernet40 209,210,211,212,213,214,215,216 Ethernet40 400000 5 9126 rs +Ethernet48 201,202,203,204,205,206,207,208 Ethernet48 400000 6 9126 rs +Ethernet56 193,194,195,196,197,198,199,200 Ethernet56 400000 7 9126 rs +Ethernet64 185,186,187,188,189,190,191,192 Ethernet64 400000 8 9126 rs +Ethernet72 177,178,179,180,181,182,183,184 Ethernet72 400000 9 9126 rs +Ethernet80 169,170,171,172,173,174,175,176 Ethernet80 400000 10 9126 rs +Ethernet88 161,162,163,164,165,166,167,168 Ethernet88 400000 11 9126 rs +Ethernet96 153,154,155,156,157,158,159,160 Ethernet96 400000 12 9126 rs +Ethernet104 145,146,147,148,149,150,151,152 Ethernet104 400000 13 9126 rs +Ethernet112 137,138,139,140,141,142,143,144 Ethernet112 400000 14 9126 rs +Ethernet120 129,130,131,132,133,134,135,136 Ethernet120 400000 15 9126 rs +Ethernet128 121,122,123,124,125,126,127,128 Ethernet128 400000 16 9126 rs +Ethernet136 113,114,115,116,117,118,119,120 Ethernet136 400000 17 9126 rs +Ethernet144 97,98,99,100,101,102,103,104 Ethernet144 400000 18 9126 rs +Ethernet152 105,106,107,108,109,110,111,112 Ethernet152 400000 19 9126 rs +Ethernet160 81,82,83,84,85,86,87,88 Ethernet160 400000 20 9126 rs +Ethernet168 89,90,91,92,93,94,95,96 Ethernet168 400000 21 9126 rs +Ethernet176 65,66,67,68,69,70,71,72 Ethernet176 400000 22 9126 rs +Ethernet184 73,74,75,76,77,78,79,80 Ethernet184 400000 23 9126 rs +Ethernet192 49,50,51,52,53,54,55,56 Ethernet192 400000 24 9126 rs +Ethernet200 57,58,59,60,61,62,63,64 Ethernet200 400000 25 9126 rs +Ethernet208 33,34,35,36,37,38,39,40 Ethernet208 400000 26 9126 rs +Ethernet216 41,42,43,44,45,46,47,48 Ethernet216 400000 27 9126 rs +Ethernet224 17,18,19,20,21,22,23,24 Ethernet224 400000 28 9126 rs +Ethernet232 25,26,27,28,29,30,31,32 Ethernet232 400000 29 9126 rs +Ethernet240 1,2,3,4,5,6,7,8 Ethernet240 400000 30 9126 rs +Ethernet248 9,10,11,12,13,14,15,16 Ethernet248 400000 31 9126 rs diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 index 6c734d46ff2..4b9748c7b59 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 32 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 index 45cebf3b714..93dac6b1992 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 64 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml index e5fbcc93543..b27f39ce113 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -504,20 +507,6 @@ nodes: speed: "100G" sysport: "13" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" tx_polarity: "01010101" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/ivm.sai.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..ff2b068dfcf --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/pg_profile_lookup.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini index 9999a677da4..f1cb943a12a 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini @@ -1,67 +1,65 @@ -# name lanes speed index mtu -Ethernet0 249,250,251,252 100000 0 9126 -Ethernet4 253,254,255,256 100000 0 9126 -Ethernet8 241,242,243,244 100000 1 9126 -Ethernet12 245,246,247,248 100000 1 9126 -Ethernet16 233,234,235,236 100000 2 9126 -Ethernet20 237,238,239,240 100000 2 9126 -Ethernet24 225,226,227,228 100000 3 9126 -Ethernet28 229,230,231,232 100000 3 9126 -Ethernet32 217,218,219,220 100000 4 9126 -Ethernet36 221,222,223,224 100000 4 9126 -Ethernet40 209,210,211,212 100000 5 9126 -Ethernet44 213,214,215,216 100000 5 9126 -Ethernet48 201,202,203,204 100000 6 9126 -Ethernet52 205,206,207,208 100000 6 9126 -Ethernet56 193,194,195,196 100000 7 9126 -Ethernet60 197,198,199,200 100000 7 9126 -Ethernet64 185,186,187,188 100000 8 9126 -Ethernet68 189,190,191,192 100000 8 9126 -Ethernet72 177,178,179,180 100000 9 9126 -Ethernet76 181,182,183,184 100000 9 9126 -Ethernet80 169,170,171,172 100000 10 9126 -Ethernet84 173,174,175,176 100000 10 9126 -Ethernet88 161,162,163,164 100000 11 9126 -Ethernet92 165,166,167,168 100000 11 9126 -Ethernet96 153,154,155,156 100000 12 9126 -Ethernet100 157,158,159,160 100000 12 9126 -Ethernet104 145,146,147,148 100000 13 9126 -Ethernet108 149,150,151,152 100000 13 9126 -Ethernet112 137,138,139,140 100000 14 9126 -Ethernet116 141,142,143,144 100000 14 9126 -Ethernet120 129,130,131,132 100000 15 9126 -Ethernet124 133,134,135,136 100000 15 9126 -Ethernet128 121,122,123,124 100000 16 9126 -Ethernet132 125,126,127,128 100000 16 9126 -Ethernet136 113,114,115,116 100000 17 9126 -Ethernet140 117,118,119,120 100000 17 9126 -Ethernet144 97,98,99,100 100000 18 9126 -Ethernet148 101,102,103,104 100000 18 9126 -Ethernet152 105,106,107,108 100000 19 9126 -Ethernet156 109,110,111,112 100000 19 9126 -Ethernet160 81,82,83,84 100000 20 9126 -Ethernet164 85,86,87,88 100000 20 9126 -Ethernet168 89,90,91,92 100000 21 9126 -Ethernet172 93,94,95,96 100000 21 9126 -Ethernet176 65,66,67,68 100000 22 9126 -Ethernet180 69,70,71,72 100000 22 9126 -Ethernet184 73,74,75,76 100000 23 9126 -Ethernet188 77,78,79,80 100000 23 9126 -Ethernet192 49,50,51,52 100000 24 9126 -Ethernet196 53,54,55,56 100000 24 9126 -Ethernet200 57,58,59,60 100000 25 9126 -Ethernet204 61,62,63,64 100000 25 9126 -Ethernet208 33,34,35,36 100000 26 9126 -Ethernet212 37,38,39,40 100000 26 9126 -Ethernet216 41,42,43,44 100000 27 9126 -Ethernet220 45,46,47,48 100000 27 9126 -Ethernet224 17,18,19,20 100000 28 9126 -Ethernet228 21,22,23,24 100000 28 9126 -Ethernet232 25,26,27,28 100000 29 9126 -Ethernet236 29,30,31,32 100000 29 9126 -Ethernet240 1,2,3,4 100000 30 9126 -Ethernet244 5,6,7,8 100000 30 9126 -Ethernet248 9,10,11,12 100000 31 9126 -Ethernet252 13,14,15,16 100000 31 9126 -Ethernet256 257 10000 32 9126 -Ethernet257 258 10000 33 9126 +# name lanes alias speed index mtu +Ethernet0 249,250,251,252 Eth1/1 100000 0 9126 +Ethernet4 253,254,255,256 Eth1/2 100000 0 9126 +Ethernet8 241,242,243,244 Eth2/1 100000 1 9126 +Ethernet12 245,246,247,248 Eth2/2 100000 1 9126 +Ethernet16 233,234,235,236 Eth3/1 100000 2 9126 +Ethernet20 237,238,239,240 Eth3/2 100000 2 9126 +Ethernet24 225,226,227,228 Eth4/1 100000 3 9126 +Ethernet28 229,230,231,232 Eth4/2 100000 3 9126 +Ethernet32 217,218,219,220 Eth5/1 100000 4 9126 +Ethernet36 221,222,223,224 Eth5/2 100000 4 9126 +Ethernet40 209,210,211,212 Eth6/1 100000 5 9126 +Ethernet44 213,214,215,216 Eth6/1 100000 5 9126 +Ethernet48 201,202,203,204 Eth7/1 100000 6 9126 +Ethernet52 205,206,207,208 Eth7/2 100000 6 9126 +Ethernet56 193,194,195,196 Eth8/1 100000 7 9126 +Ethernet60 197,198,199,200 Eth8/2 100000 7 9126 +Ethernet64 185,186,187,188 Eth9/2 100000 8 9126 +Ethernet68 189,190,191,192 Eth9/2 100000 8 9126 +Ethernet72 177,178,179,180 Eth10/1 100000 9 9126 +Ethernet76 181,182,183,184 Eth10/2 100000 9 9126 +Ethernet80 169,170,171,172 Eth11/1 100000 10 9126 +Ethernet84 173,174,175,176 Eth11/2 100000 10 9126 +Ethernet88 161,162,163,164 Eth12/1 100000 11 9126 +Ethernet92 165,166,167,168 Eth12/2 100000 11 9126 +Ethernet96 153,154,155,156 Eth13/1 100000 12 9126 +Ethernet100 157,158,159,160 Eth13/2 100000 12 9126 +Ethernet104 145,146,147,148 Eth14/1 100000 13 9126 +Ethernet108 149,150,151,152 Eth14/2 100000 13 9126 +Ethernet112 137,138,139,140 Eth15/1 100000 14 9126 +Ethernet116 141,142,143,144 Eth15/2 100000 14 9126 +Ethernet120 129,130,131,132 Eth16/1 100000 15 9126 +Ethernet124 133,134,135,136 Eth16/2 100000 15 9126 +Ethernet128 121,122,123,124 Eth17/1 100000 16 9126 +Ethernet132 125,126,127,128 Eth17/2 100000 16 9126 +Ethernet136 113,114,115,116 Eth18/1 100000 17 9126 +Ethernet140 117,118,119,120 Eth18/2 100000 17 9126 +Ethernet144 97,98,99,100 Eth19/1 100000 18 9126 +Ethernet148 101,102,103,104 Eth19/2 100000 18 9126 +Ethernet152 105,106,107,108 Eth20/1 100000 19 9126 +Ethernet156 109,110,111,112 Eth20/2 100000 19 9126 +Ethernet160 81,82,83,84 Eth21/1 100000 20 9126 +Ethernet164 85,86,87,88 Eth21/2 100000 20 9126 +Ethernet168 89,90,91,92 Eth22/1 100000 21 9126 +Ethernet172 93,94,95,96 Eth22/2 100000 21 9126 +Ethernet176 65,66,67,68 Eth23/1 100000 22 9126 +Ethernet180 69,70,71,72 Eth23/2 100000 22 9126 +Ethernet184 73,74,75,76 Eth24/1 100000 23 9126 +Ethernet188 77,78,79,80 Eth24/2 100000 23 9126 +Ethernet192 49,50,51,52 Eth25/1 100000 24 9126 +Ethernet196 53,54,55,56 Eth25/2 100000 24 9126 +Ethernet200 57,58,59,60 Eth26/1 100000 25 9126 +Ethernet204 61,62,63,64 Eth26/2 100000 25 9126 +Ethernet208 33,34,35,36 Eth27/1 100000 26 9126 +Ethernet212 37,38,39,40 Eth27/2 100000 26 9126 +Ethernet216 41,42,43,44 Eth28/1 100000 27 9126 +Ethernet220 45,46,47,48 Eth28/2 100000 27 9126 +Ethernet224 17,18,19,20 Eth29/1 100000 28 9126 +Ethernet228 21,22,23,24 Eth29/2 100000 28 9126 +Ethernet232 25,26,27,28 Eth30/1 100000 29 9126 +Ethernet236 29,30,31,32 Eth30/2 100000 29 9126 +Ethernet240 1,2,3,4 Eth31/1 100000 30 9126 +Ethernet244 5,6,7,8 Eth31/2 100000 30 9126 +Ethernet248 9,10,11,12 Eth32/1 100000 31 9126 +Ethernet252 13,14,15,16 Eth32/2 100000 31 9126 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 index 16f9b42a216..4b9748c7b59 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 64 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 index 45cebf3b714..93dac6b1992 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 @@ -1,6 +1,5 @@ {# Default values which will be used if no actual configura available #} -{% set default_cable = '300m' %} -{% set default_ports_num = 64 -%} +{% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} {# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} @@ -12,44 +11,53 @@ } %} -{%- macro cable_length(port_name) -%} - {%- set cable_len = [] -%} - {%- for local_port in DEVICE_NEIGHBOR -%} - {%- if local_port == port_name -%} - {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} - {%- set neighbor_role = neighbor.type -%} +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} {%- set roles1 = switch_role + '_' + neighbor_role %} - {%- set roles2 = neighbor_role + '_' + switch_role -%} - {%- set roles1 = roles1 | lower -%} - {%- set roles2 = roles2 | lower -%} - {%- if roles1 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} - {%- elif roles2 in ports2cable -%} - {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} {%- if cable_len -%} {{ cable_len.0 }} - {%- else -%} - {{ default_cable }} - {%- endif -%} -{% endmacro %} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} {%- if DEVICE_METADATA is defined %} {%- set switch_role = DEVICE_METADATA['localhost']['type'] %} {%- endif -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -57,6 +65,15 @@ {% set port_names = port_names_list | join(',') -%} { + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, "BUFFER_POOL": { "ingress_lossless_pool": { "size": "47218432", @@ -64,7 +81,7 @@ "mode": "dynamic", "xoff": "17708800" }, - "egress_lossy_pool": { + "lossy_pool": { "size": "18874368", "type": "egress", "mode": "dynamic", @@ -74,46 +91,46 @@ "BUFFER_PROFILE": { "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"1433600", + "xoff":"38816", "size":"1518", - "dynamic_th":"-4", - "xon_offset":"6272" + "dynamic_th":"1", + "xon_offset":"13440" }, - "ingress_lossy_profile": { + "egress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, - "egress_lossless_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", "size":"0", - "static_th":"9721600" + "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|egress_lossy_pool]", + "pool":"[BUFFER_POOL|lossy_pool]", "size":"1518", - "dynamic_th":"3" + "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-3": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" }, - "{{ port_names }}|4-5": { + "{{ port_names }}|3-4": { "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" }, - "{{ port_names }}|6-7": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" } }, "BUFFER_QUEUE": { - "{{ port_names }}|4-5": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" }, - "{{ port_names }}|0-3": { + "{{ port_names }}|0-2": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" }, - "{{ port_names }}|6-7": { + "{{ port_names }}|5-7": { "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml index 4b75a205ab5..498155cf374 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml @@ -4,12 +4,15 @@ ifcs: nodes: - node_id: "0" options: + sd_low_power_mode_global_default: "true" sku: "configs/sku/innovium.77700_B" netdev: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" txring: - txring_id: "0" desc_count: "1024" @@ -504,20 +507,6 @@ nodes: speed: "200G" sysport: "13" type: "eth" - - fec: "NONE" - id: "257" - lanes: "0:1" - serdes_group: "32" - speed: "10G" - sysport: "257" - type: "mgmt 0" - - fec: "NONE" - id: "258" - lanes: "1:1" - serdes_group: "32" - speed: "10G" - sysport: "258" - type: "mgmt 1" isg: - id: "0" tx_polarity: "01010101" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/ivm.sai.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/ivm.sai.config.yaml new file mode 100755 index 00000000000..fd8e0191085 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x200G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/pg_profile_lookup.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini index 726e1a377d8..0a569b45951 100644 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini @@ -1,67 +1,65 @@ -# name lanes speed index mtu -Ethernet0 249,250,251,252 200000 0 9126 -Ethernet4 253,254,255,256 200000 0 9126 -Ethernet8 241,242,243,244 200000 1 9126 -Ethernet12 245,246,247,248 200000 1 9126 -Ethernet16 233,234,235,236 200000 2 9126 -Ethernet20 237,238,239,240 200000 2 9126 -Ethernet24 225,226,227,228 200000 3 9126 -Ethernet28 229,230,231,232 200000 3 9126 -Ethernet32 217,218,219,220 200000 4 9126 -Ethernet36 221,222,223,224 200000 4 9126 -Ethernet40 209,210,211,212 200000 5 9126 -Ethernet44 213,214,215,216 200000 5 9126 -Ethernet48 201,202,203,204 200000 6 9126 -Ethernet52 205,206,207,208 200000 6 9126 -Ethernet56 193,194,195,196 200000 7 9126 -Ethernet60 197,198,199,200 200000 7 9126 -Ethernet64 185,186,187,188 200000 8 9126 -Ethernet68 189,190,191,192 200000 8 9126 -Ethernet72 177,178,179,180 200000 9 9126 -Ethernet76 181,182,183,184 200000 9 9126 -Ethernet80 169,170,171,172 200000 10 9126 -Ethernet84 173,174,175,176 200000 10 9126 -Ethernet88 161,162,163,164 200000 11 9126 -Ethernet92 165,166,167,168 200000 11 9126 -Ethernet96 153,154,155,156 200000 12 9126 -Ethernet100 157,158,159,160 200000 12 9126 -Ethernet104 145,146,147,148 200000 13 9126 -Ethernet108 149,150,151,152 200000 13 9126 -Ethernet112 137,138,139,140 200000 14 9126 -Ethernet116 141,142,143,144 200000 14 9126 -Ethernet120 129,130,131,132 200000 15 9126 -Ethernet124 133,134,135,136 200000 15 9126 -Ethernet128 121,122,123,124 200000 16 9126 -Ethernet132 125,126,127,128 200000 16 9126 -Ethernet136 113,114,115,116 200000 17 9126 -Ethernet140 117,118,119,120 200000 17 9126 -Ethernet144 97,98,99,100 200000 18 9126 -Ethernet148 101,102,103,104 200000 18 9126 -Ethernet152 105,106,107,108 200000 19 9126 -Ethernet156 109,110,111,112 200000 19 9126 -Ethernet160 81,82,83,84 200000 20 9126 -Ethernet164 85,86,87,88 200000 20 9126 -Ethernet168 89,90,91,92 200000 21 9126 -Ethernet172 93,94,95,96 200000 21 9126 -Ethernet176 65,66,67,68 200000 22 9126 -Ethernet180 69,70,71,72 200000 22 9126 -Ethernet184 73,74,75,76 200000 23 9126 -Ethernet188 77,78,79,80 200000 23 9126 -Ethernet192 49,50,51,52 200000 24 9126 -Ethernet196 53,54,55,56 200000 24 9126 -Ethernet200 57,58,59,60 200000 25 9126 -Ethernet204 61,62,63,64 200000 25 9126 -Ethernet208 33,34,35,36 200000 26 9126 -Ethernet212 37,38,39,40 200000 26 9126 -Ethernet216 41,42,43,44 200000 27 9126 -Ethernet220 45,46,47,48 200000 27 9126 -Ethernet224 17,18,19,20 200000 28 9126 -Ethernet228 21,22,23,24 200000 28 9126 -Ethernet232 25,26,27,28 200000 29 9126 -Ethernet236 29,30,31,32 200000 29 9126 -Ethernet240 1,2,3,4 200000 30 9126 -Ethernet244 5,6,7,8 200000 30 9126 -Ethernet248 9,10,11,12 200000 31 9126 -Ethernet252 13,14,15,16 200000 31 9126 -Ethernet256 257 10000 32 9126 -Ethernet257 258 10000 33 9126 +# name lanes alias speed index mtu +Ethernet0 249,250,251,252 Eth1/1 200000 0 9126 +Ethernet4 253,254,255,256 Eth1/2 200000 0 9126 +Ethernet8 241,242,243,244 Eth2/1 200000 1 9126 +Ethernet12 245,246,247,248 Eth2/2 200000 1 9126 +Ethernet16 233,234,235,236 Eth3/1 200000 2 9126 +Ethernet20 237,238,239,240 Eth3/2 200000 2 9126 +Ethernet24 225,226,227,228 Eth4/1 200000 3 9126 +Ethernet28 229,230,231,232 Eth4/2 200000 3 9126 +Ethernet32 217,218,219,220 Eth5/1 200000 4 9126 +Ethernet36 221,222,223,224 Eth5/2 200000 4 9126 +Ethernet40 209,210,211,212 Eth6/1 200000 5 9126 +Ethernet44 213,214,215,216 Eth6/1 200000 5 9126 +Ethernet48 201,202,203,204 Eth7/1 200000 6 9126 +Ethernet52 205,206,207,208 Eth7/2 200000 6 9126 +Ethernet56 193,194,195,196 Eth8/1 200000 7 9126 +Ethernet60 197,198,199,200 Eth8/2 200000 7 9126 +Ethernet64 185,186,187,188 Eth9/2 200000 8 9126 +Ethernet68 189,190,191,192 Eth9/2 200000 8 9126 +Ethernet72 177,178,179,180 Eth10/1 200000 9 9126 +Ethernet76 181,182,183,184 Eth10/2 200000 9 9126 +Ethernet80 169,170,171,172 Eth11/1 200000 10 9126 +Ethernet84 173,174,175,176 Eth11/2 200000 10 9126 +Ethernet88 161,162,163,164 Eth12/1 200000 11 9126 +Ethernet92 165,166,167,168 Eth12/2 200000 11 9126 +Ethernet96 153,154,155,156 Eth13/1 200000 12 9126 +Ethernet100 157,158,159,160 Eth13/2 200000 12 9126 +Ethernet104 145,146,147,148 Eth14/1 200000 13 9126 +Ethernet108 149,150,151,152 Eth14/2 200000 13 9126 +Ethernet112 137,138,139,140 Eth15/1 200000 14 9126 +Ethernet116 141,142,143,144 Eth15/2 200000 14 9126 +Ethernet120 129,130,131,132 Eth16/1 200000 15 9126 +Ethernet124 133,134,135,136 Eth16/2 200000 15 9126 +Ethernet128 121,122,123,124 Eth17/1 200000 16 9126 +Ethernet132 125,126,127,128 Eth17/2 200000 16 9126 +Ethernet136 113,114,115,116 Eth18/1 200000 17 9126 +Ethernet140 117,118,119,120 Eth18/2 200000 17 9126 +Ethernet144 97,98,99,100 Eth19/1 200000 18 9126 +Ethernet148 101,102,103,104 Eth19/2 200000 18 9126 +Ethernet152 105,106,107,108 Eth20/1 200000 19 9126 +Ethernet156 109,110,111,112 Eth20/2 200000 19 9126 +Ethernet160 81,82,83,84 Eth21/1 200000 20 9126 +Ethernet164 85,86,87,88 Eth21/2 200000 20 9126 +Ethernet168 89,90,91,92 Eth22/1 200000 21 9126 +Ethernet172 93,94,95,96 Eth22/2 200000 21 9126 +Ethernet176 65,66,67,68 Eth23/1 200000 22 9126 +Ethernet180 69,70,71,72 Eth23/2 200000 22 9126 +Ethernet184 73,74,75,76 Eth24/1 200000 23 9126 +Ethernet188 77,78,79,80 Eth24/2 200000 23 9126 +Ethernet192 49,50,51,52 Eth25/1 200000 24 9126 +Ethernet196 53,54,55,56 Eth25/2 200000 24 9126 +Ethernet200 57,58,59,60 Eth26/1 200000 25 9126 +Ethernet204 61,62,63,64 Eth26/2 200000 25 9126 +Ethernet208 33,34,35,36 Eth27/1 200000 26 9126 +Ethernet212 37,38,39,40 Eth27/2 200000 26 9126 +Ethernet216 41,42,43,44 Eth28/1 200000 27 9126 +Ethernet220 45,46,47,48 Eth28/2 200000 27 9126 +Ethernet224 17,18,19,20 Eth29/1 200000 28 9126 +Ethernet228 21,22,23,24 Eth29/2 200000 28 9126 +Ethernet232 25,26,27,28 Eth30/1 200000 29 9126 +Ethernet236 29,30,31,32 Eth30/2 200000 29 9126 +Ethernet240 1,2,3,4 Eth31/1 200000 30 9126 +Ethernet244 5,6,7,8 Eth31/2 200000 30 9126 +Ethernet248 9,10,11,12 Eth32/1 200000 31 9126 +Ethernet252 13,14,15,16 Eth32/2 200000 31 9126 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 index 16f9b42a216..4b9748c7b59 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 @@ -1,14 +1,3 @@ -{# Default values which will be used if no actual configura available #} - -{% set default_ports_num = 64 -%} -{# Generate list of ports if not defined #} -{% if PORT is not defined %} - {% set PORT = [] %} - {% for port_idx in range(0,default_ports_num) %} - {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} - {% endfor %} -{% endif -%} - {% set port_names_list = [] %} {% for port in PORT %} {%- if port_names_list.append(port) %}{% endif %} @@ -19,24 +8,24 @@ { "TC_TO_QUEUE_MAP":{ "AZURE":{ - "1":"1", "0":"0", - "3":"3", + "1":"1", "2":"2", - "5":"5", + "3":"3", "4":"4", - "7":"7", - "6":"6" + "5":"5", + "6":"6", + "7":"7" } }, "TC_TO_PRIORITY_GROUP_MAP": { "AZURE": { - "1": "0", "0": "0", - "3": "0", + "1": "0", "2": "0", - "4": "1", - "5": "2", + "3": "3", + "4": "4", + "5": "0", "6": "0", "7": "0" } @@ -46,9 +35,9 @@ "0":"0", "1":"0", "2":"0", - "3":"0", + "3":"3", "4":"4", - "5":"5", + "5":"0", "6":"0", "7":"0", "8":"1", @@ -111,10 +100,15 @@ }, "PORT_QOS_MAP": { "{{ port_names }}": { - "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", - "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", - "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", - "pfc_enable": "4,5" + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" } } } diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos_defaults_t1.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile index 0769b3063a1..aba4fc81fb1 100755 --- a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/pmon_daemon_control.json b/device/delta/x86_64-delta_et-c032if-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..f490a4dc0f3 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_thermalctld": true +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/topo.conf b/device/delta/x86_64-delta_et-c032if-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/buffers.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/buffers.json.j2 new file mode 100644 index 00000000000..44f6abfe9a9 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 32 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "egress_lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/config_32x200G_Delta-evs-a-32q56.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/config_32x200G_Delta-evs-a-32q56.yaml new file mode 100755 index 00000000000..2ba23d2a5a6 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/config_32x200G_Delta-evs-a-32q56.yaml @@ -0,0 +1,429 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/innovium.77700_A b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/innovium.77700_A new file mode 100644 index 00000000000..84aa4198360 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/ivm.sai.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/ivm.sai.config.yaml new file mode 100755 index 00000000000..607e2da9312 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Delta-evs-a-32q56.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55300" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +AVG_IPG_RESERVED_SIZE: "1518" +AVG_QUEUE_RESERVED_SIZE: "1518" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..2dcf88fc955 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/ivm.sai.datapath.config.yaml @@ -0,0 +1,10 @@ +ISAI_PARAM_A000 : "0" +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/port_config.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/port_config.ini new file mode 100755 index 00000000000..7e9fc331edf --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/port_config.ini @@ -0,0 +1,35 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 200000 0 9126 rs +Ethernet4 241,242,243,244 200000 1 9126 rs +Ethernet8 233,234,235,236 200000 2 9126 rs +Ethernet12 225,226,227,228 200000 3 9126 rs +Ethernet16 217,218,219,220 200000 4 9126 rs +Ethernet20 209,210,211,212 200000 5 9126 rs +Ethernet24 201,202,203,204 200000 6 9126 rs +Ethernet28 193,194,195,196 200000 7 9126 rs +Ethernet32 185,186,187,188 200000 8 9126 rs +Ethernet36 177,178,179,180 200000 9 9126 rs +Ethernet40 169,170,171,172 200000 10 9126 rs +Ethernet44 161,162,163,164 200000 11 9126 rs +Ethernet48 153,154,155,156 200000 12 9126 rs +Ethernet52 145,146,147,148 200000 13 9126 rs +Ethernet56 137,138,139,140 200000 14 9126 rs +Ethernet60 129,130,131,132 200000 15 9126 rs +Ethernet64 121,122,123,124 200000 16 9126 rs +Ethernet68 113,114,115,116 200000 17 9126 rs +Ethernet72 97,98,99,100 200000 18 9126 rs +Ethernet76 105,106,107,108 200000 19 9126 rs +Ethernet80 81,82,83,84 200000 20 9126 rs +Ethernet84 89,90,91,92 200000 21 9126 rs +Ethernet88 65,66,67,68 200000 22 9126 rs +Ethernet92 73,74,75,76 200000 23 9126 rs +Ethernet96 49,50,51,52 200000 24 9126 rs +Ethernet100 57,58,59,60 200000 25 9126 rs +Ethernet104 33,34,35,36 200000 26 9126 rs +Ethernet108 41,42,43,44 200000 27 9126 rs +Ethernet112 17,18,19,20 200000 28 9126 rs +Ethernet116 25,26,27,28 200000 29 9126 rs +Ethernet120 1,2,3,4 200000 30 9126 rs +Ethernet124 9,10,11,12 200000 31 9126 rs +Ethernet256 257 10000 32 9126 none +Ethernet257 258 10000 33 9126 none diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/qos.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/qos.json.j2 new file mode 100755 index 00000000000..374e849588c --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 32 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/sai.profile b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/sai.profile new file mode 100755 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/Delta-evs-a-32q56/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers.json.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..72a618f07f4 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/config_32x200G_Delta-evs-a-32q56.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/config_32x200G_Delta-evs-a-32q56.yaml new file mode 100755 index 00000000000..2ba23d2a5a6 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/config_32x200G_Delta-evs-a-32q56.yaml @@ -0,0 +1,429 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/innovium.77700_A b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/innovium.77700_A new file mode 100644 index 00000000000..84aa4198360 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/ivm.sai.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/ivm.sai.config.yaml new file mode 100755 index 00000000000..ff1b69d1137 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Delta-evs-a-32q56.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55300" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..2dcf88fc955 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/ivm.sai.datapath.config.yaml @@ -0,0 +1,10 @@ +ISAI_PARAM_A000 : "0" +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/pg_profile_lookup.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/port_config.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/port_config.ini new file mode 100755 index 00000000000..7e9fc331edf --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/port_config.ini @@ -0,0 +1,35 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 200000 0 9126 rs +Ethernet4 241,242,243,244 200000 1 9126 rs +Ethernet8 233,234,235,236 200000 2 9126 rs +Ethernet12 225,226,227,228 200000 3 9126 rs +Ethernet16 217,218,219,220 200000 4 9126 rs +Ethernet20 209,210,211,212 200000 5 9126 rs +Ethernet24 201,202,203,204 200000 6 9126 rs +Ethernet28 193,194,195,196 200000 7 9126 rs +Ethernet32 185,186,187,188 200000 8 9126 rs +Ethernet36 177,178,179,180 200000 9 9126 rs +Ethernet40 169,170,171,172 200000 10 9126 rs +Ethernet44 161,162,163,164 200000 11 9126 rs +Ethernet48 153,154,155,156 200000 12 9126 rs +Ethernet52 145,146,147,148 200000 13 9126 rs +Ethernet56 137,138,139,140 200000 14 9126 rs +Ethernet60 129,130,131,132 200000 15 9126 rs +Ethernet64 121,122,123,124 200000 16 9126 rs +Ethernet68 113,114,115,116 200000 17 9126 rs +Ethernet72 97,98,99,100 200000 18 9126 rs +Ethernet76 105,106,107,108 200000 19 9126 rs +Ethernet80 81,82,83,84 200000 20 9126 rs +Ethernet84 89,90,91,92 200000 21 9126 rs +Ethernet88 65,66,67,68 200000 22 9126 rs +Ethernet92 73,74,75,76 200000 23 9126 rs +Ethernet96 49,50,51,52 200000 24 9126 rs +Ethernet100 57,58,59,60 200000 25 9126 rs +Ethernet104 33,34,35,36 200000 26 9126 rs +Ethernet108 41,42,43,44 200000 27 9126 rs +Ethernet112 17,18,19,20 200000 28 9126 rs +Ethernet116 25,26,27,28 200000 29 9126 rs +Ethernet120 1,2,3,4 200000 30 9126 rs +Ethernet124 9,10,11,12 200000 31 9126 rs +Ethernet256 257 10000 32 9126 none +Ethernet257 258 10000 33 9126 none diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos.json.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/sai.profile b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/sai.profile new file mode 100755 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers.json.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..72a618f07f4 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/config_32x100G_Delta-evs-a-32q56.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/config_32x100G_Delta-evs-a-32q56.yaml new file mode 100755 index 00000000000..4001da815d4 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/config_32x100G_Delta-evs-a-32q56.yaml @@ -0,0 +1,396 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.55300" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + skip_pll_check: "false" + mac_clk: "750" + sys_clk: "1300" + ifc_clk: "675" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + netdev: "true" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + netdev: "true" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + netdev: "true" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + netdev: "true" + devports: + - id: "0" + sysport: "129" + type: "cpu" + - id: "121" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - id: "125" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - id: "113" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - id: "117" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - id: "105" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - id: "109" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - id: "97" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - id: "101" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - id: "89" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - id: "93" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - id: "81" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - id: "85" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - id: "73" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - id: "77" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - id: "65" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - id: "69" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - id: "57" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - id: "61" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + - id: "49" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - id: "53" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + - id: "41" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - id: "45" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + - id: "33" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - id: "37" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - id: "25" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - id: "29" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - id: "17" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - id: "21" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - id: "9" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - id: "13" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - id: "1" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - id: "5" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" +# Aux ports to be enabled later +# - id: "33" +# fec: "NONE" +# lanes: "0:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "33" +# type: "mgmt 0" +# - id: "34" +# fec: "NONE" +# lanes: "1:1" +# serdes_group: "16" +# speed: "10G" +# sysport: "34" +# type: "mgmt 1" + isg: + - id: "0" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "10011110" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "1" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "00010001" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "2" + lane_swap: "01234567" + rx_polarity: "00100000" + tx_polarity: "01101111" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "3" + lane_swap: "01234567" + rx_polarity: "01000001" + tx_polarity: "10101000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "4" + lane_swap: "01234567" + rx_polarity: "00010000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "5" + lane_swap: "01234567" + rx_polarity: "10100000" + tx_polarity: "01100100" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "6" + lane_swap: "01234567" + rx_polarity: "01010000" + tx_polarity: "00000100" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "7" + lane_swap: "01234567" + rx_polarity: "10000011" + tx_polarity: "00010110" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "8" + lane_swap: "01234567" + rx_polarity: "00001000" + tx_polarity: "00001000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "9" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100100" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00100011" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "11" + lane_swap: "01234567" + rx_polarity: "01000001" + tx_polarity: "00100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "12" + lane_swap: "01234567" + rx_polarity: "00001010" + tx_polarity: "01010111" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "13" + lane_swap: "01234567" + rx_polarity: "01001011" + tx_polarity: "00111010" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "14" + lane_swap: "01234567" + rx_polarity: "01000000" + tx_polarity: "11010111" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "15" + lane_swap: "01234567" + rx_polarity: "01000010" + tx_polarity: "11011000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/innovium.55300 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/innovium.55300 new file mode 100644 index 00000000000..59383ec30ec --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/innovium.55300 @@ -0,0 +1,62 @@ +sku: innovium.55300 + +device_id: 0x1b59 + +# Hardware constraint information +hardware: + num_ibs: 2 + ib_active: 0, 1 + + ports_per_ib: 64, 64 + recirc_port_num: 64, 64 + cpu_port_num: 65 + cpu_port_ib: 0 + mgmt_port_num: 65, 66 + mgmt_port_ibs: 1, 1 + + pics_per_ib: 9, 9 + pic_ports_per_pic: 8 + max_serdes_speed: 25 + + num_shared_pics: 0 + + isg [0-7]: + ib: 0 + pic_id: [0-7] + + isg 8: + ib: 1 + pic_id: 7 + + isg 9: + ib: 1 + pic_id: 6 + + isg 10: + ib: 1 + pic_id: 5 + + isg 11: + ib: 1 + pic_id: 4 + + isg 12: + ib: 1 + pic_id: 3 + + isg 13: + ib: 1 + pic_id: 2 + + isg 14: + ib: 1 + pic_id: 1 + + isg 15: + ib: 1 + pic_id: 0 + + isg 16: + mode: 0:2 + ib: 1 + pic_id: 8 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/ivm.sai.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..cc13d7b64f9 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Delta-evs-a-32q56.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55300" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "64" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..ef4bc6d129c --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/pg_profile_lookup.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/port_config.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/port_config.ini new file mode 100755 index 00000000000..7cb58b4120c --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes speed index mtu fec +Ethernet0 121,122,123,124 100000 0 9126 rs +Ethernet4 125,126,127,128 100000 1 9126 rs +Ethernet8 113,114,115,116 100000 2 9126 rs +Ethernet12 117,118,119,120 100000 3 9126 rs +Ethernet16 105,106,107,108 100000 4 9126 rs +Ethernet20 109,110,111,112 100000 5 9126 rs +Ethernet24 97,98,99,100 100000 6 9126 rs +Ethernet28 101,102,103,104 100000 7 9126 rs +Ethernet32 89,90,91,92 100000 8 9126 rs +Ethernet36 93,94,95,96 100000 9 9126 rs +Ethernet40 81,82,83,84 100000 10 9126 rs +Ethernet44 85,86,87,88 100000 11 9126 rs +Ethernet48 73,74,75,76 100000 12 9126 rs +Ethernet52 77,78,79,80 100000 13 9126 rs +Ethernet56 65,66,67,68 100000 14 9126 rs +Ethernet60 69,70,71,72 100000 15 9126 rs +Ethernet64 57,58,59,60 100000 16 9126 rs +Ethernet68 61,62,63,64 100000 17 9126 rs +Ethernet72 49,50,51,52 100000 18 9126 rs +Ethernet76 53,54,55,56 100000 19 9126 rs +Ethernet80 41,42,43,44 100000 20 9126 rs +Ethernet84 45,46,47,48 100000 21 9126 rs +Ethernet88 33,34,35,36 100000 22 9126 rs +Ethernet92 37,38,39,40 100000 23 9126 rs +Ethernet96 25,26,27,28 100000 24 9126 rs +Ethernet100 29,30,31,32 100000 25 9126 rs +Ethernet104 17,18,19,20 100000 26 9126 rs +Ethernet108 21,22,23,24 100000 27 9126 rs +Ethernet112 9,10,11,12 100000 28 9126 rs +Ethernet116 13,14,15,16 100000 29 9126 rs +Ethernet120 1,2,3,4 100000 30 9126 rs +Ethernet124 5,6,7,8 100000 31 9126 rs diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos.json.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/sai.profile b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/sai.profile new file mode 100755 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_32x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers.json.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..72a618f07f4 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_lossy_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_lossy_t1.j2 new file mode 100644 index 00000000000..6e07eb1d5e8 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_lossy_t1.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1120", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/config_48x25G_8x100G_Delta-evs-a-32q56.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/config_48x25G_8x100G_Delta-evs-a-32q56.yaml new file mode 100755 index 00000000000..184e76c2b8a --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/config_48x25G_8x100G_Delta-evs-a-32q56.yaml @@ -0,0 +1,561 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.55200" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + skip_pll_check: "false" + mac_clk: "750" + sys_clk: "975" + ifc_clk: "525" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + netdev: "true" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + netdev: "true" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + netdev: "true" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + netdev: "true" + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - id: "1" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "1" + type: "eth" + - id: "2" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "2" + type: "eth" + - id: "3" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "3" + type: "eth" + - id: "4" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "4" + type: "eth" + - id: "5" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "14" + speed: "25G" + sysport: "5" + type: "eth" + - id: "6" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "14" + speed: "25G" + sysport: "6" + type: "eth" + - id: "7" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "14" + speed: "25G" + sysport: "7" + type: "eth" + - id: "8" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "14" + speed: "25G" + sysport: "8" + type: "eth" + - id: "9" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "13" + speed: "25G" + sysport: "9" + type: "eth" + - id: "10" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "13" + speed: "25G" + sysport: "10" + type: "eth" + - id: "11" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "13" + speed: "25G" + sysport: "11" + type: "eth" + - id: "12" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "13" + speed: "25G" + sysport: "12" + type: "eth" + - id: "13" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "13" + type: "eth" + - id: "14" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "14" + type: "eth" + - id: "15" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "15" + type: "eth" + - id: "16" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "16" + type: "eth" + - id: "17" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "11" + speed: "25G" + sysport: "17" + type: "eth" + - id: "18" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "11" + speed: "25G" + sysport: "18" + type: "eth" + - id: "19" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "11" + speed: "25G" + sysport: "19" + type: "eth" + - id: "20" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "11" + speed: "25G" + sysport: "20" + type: "eth" + - id: "21" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "21" + type: "eth" + - id: "22" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "22" + type: "eth" + - id: "23" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "23" + type: "eth" + - id: "24" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "24" + type: "eth" + - id: "25" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "25" + type: "eth" + - id: "26" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "5" + speed: "25G" + sysport: "26" + type: "eth" + - id: "27" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "27" + type: "eth" + - id: "28" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "28" + type: "eth" + - id: "29" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "29" + type: "eth" + - id: "30" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "5" + speed: "25G" + sysport: "30" + type: "eth" + - id: "31" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "5" + speed: "25G" + sysport: "31" + type: "eth" + - id: "32" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "5" + speed: "25G" + sysport: "32" + type: "eth" + - id: "33" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "3" + speed: "25G" + sysport: "33" + type: "eth" + - id: "34" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "3" + speed: "25G" + sysport: "34" + type: "eth" + - id: "35" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "3" + speed: "25G" + sysport: "35" + type: "eth" + - id: "36" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "3" + speed: "25G" + sysport: "36" + type: "eth" + - id: "37" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "3" + speed: "25G" + sysport: "37" + type: "eth" + - id: "38" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "3" + speed: "25G" + sysport: "38" + type: "eth" + - id: "39" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "3" + speed: "25G" + sysport: "39" + type: "eth" + - id: "40" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "3" + speed: "25G" + sysport: "40" + type: "eth" + - id: "41" + fec: "KRFEC" + lanes: "2:1" + serdes_group: "2" + speed: "25G" + sysport: "41" + type: "eth" + - id: "42" + fec: "KRFEC" + lanes: "0:1" + serdes_group: "2" + speed: "25G" + sysport: "42" + type: "eth" + - id: "43" + fec: "KRFEC" + lanes: "4:1" + serdes_group: "2" + speed: "25G" + sysport: "43" + type: "eth" + - id: "44" + fec: "KRFEC" + lanes: "1:1" + serdes_group: "2" + speed: "25G" + sysport: "44" + type: "eth" + - id: "45" + fec: "KRFEC" + lanes: "6:1" + serdes_group: "2" + speed: "25G" + sysport: "45" + type: "eth" + - id: "46" + fec: "KRFEC" + lanes: "3:1" + serdes_group: "2" + speed: "25G" + sysport: "46" + type: "eth" + - id: "47" + fec: "KRFEC" + lanes: "7:1" + serdes_group: "2" + speed: "25G" + sysport: "47" + type: "eth" + - id: "48" + fec: "KRFEC" + lanes: "5:1" + serdes_group: "2" + speed: "25G" + sysport: "48" + type: "eth" + - id: "49" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "49" + type: "eth" + - id: "50" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "50" + type: "eth" + - id: "51" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "51" + type: "eth" + - id: "52" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "52" + type: "eth" + - id: "53" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "53" + type: "eth" + - id: "54" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "54" + type: "eth" + - id: "55" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "55" + type: "eth" + - id: "56" + fec: "KRFEC" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "56" + type: "eth" + - id: "130" + fec: "NONE" + lanes: "0:1" + serdes_group: "16" + speed: "10G" + sysport: "130" + type: "mgmt 0" + - id: "131" + fec: "NONE" + lanes: "1:1" + serdes_group: "16" + speed: "10G" + sysport: "131" + type: "mgmt 1" + isg: + - id: "0" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "10011110" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "1" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "00010001" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "2" + lane_swap: "01234567" + rx_polarity: "00100000" + tx_polarity: "01101111" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "3" + lane_swap: "01234567" + rx_polarity: "01000001" + tx_polarity: "10101000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "4" + lane_swap: "01234567" + rx_polarity: "00010000" + tx_polarity: "10100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "5" + lane_swap: "01234567" + rx_polarity: "10100000" + tx_polarity: "01100100" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "6" + lane_swap: "01234567" + rx_polarity: "01010000" + tx_polarity: "00000100" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "7" + lane_swap: "01234567" + rx_polarity: "10000011" + tx_polarity: "00010110" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "8" + lane_swap: "01234567" + rx_polarity: "00001000" + tx_polarity: "00001000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "9" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "10100100" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00100011" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "11" + lane_swap: "01234567" + rx_polarity: "01000001" + tx_polarity: "00100000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "12" + lane_swap: "01234567" + rx_polarity: "00001010" + tx_polarity: "01010111" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "13" + lane_swap: "01234567" + rx_polarity: "01001011" + tx_polarity: "00111010" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "14" + lane_swap: "01234567" + rx_polarity: "01000000" + tx_polarity: "11010111" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" + - id: "15" + lane_swap: "01234567" + rx_polarity: "01000010" + tx_polarity: "11011000" + pre1: "-3, -3, -3, -3, -3, -3, -3, -3" + main: "20, 20, 20, 20, 20, 20, 20, 20" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/innovium.55200 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/innovium.55200 new file mode 100644 index 00000000000..1ceb2ed4a5e --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/innovium.55200 @@ -0,0 +1,62 @@ +sku: innovium.55200 + +device_id: 0x1b59 + +# Hardware constraint information +hardware: + num_ibs: 2 + ib_active: 0, 1 + + ports_per_ib: 64, 64 + recirc_port_num: 64, 64 + cpu_port_num: 65 + cpu_port_ib: 0 + mgmt_port_num: 65, 66 + mgmt_port_ibs: 1, 1 + + pics_per_ib: 9, 9 + pic_ports_per_pic: 8 + max_serdes_speed: 25 + + num_shared_pics: 0 + + isg [0-7]: + ib: 0 + pic_id: [0-7] + + isg 8: + ib: 1 + pic_id: 7 + + isg 9: + ib: 1 + pic_id: 6 + + isg 10: + ib: 1 + pic_id: 5 + + isg 11: + ib: 1 + pic_id: 4 + + isg 12: + ib: 1 + pic_id: 3 + + isg 13: + ib: 1 + pic_id: 2 + + isg 14: + ib: 1 + pic_id: 1 + + isg 15: + ib: 1 + pic_id: 0 + + isg 16: + mode: 0:2 + ib: 1 + pic_id: 8 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/ivm.sai.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..313f47fe1f0 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_48x25G_8x100G_Delta-evs-a-32q56.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55200" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "64" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..ef4bc6d129c --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/pg_profile_lookup.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/port_config.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/port_config.ini new file mode 100755 index 00000000000..be220fe39a0 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/port_config.ini @@ -0,0 +1,58 @@ +# name lanes speed index mtu fec +Ethernet0 113 25000 0 9126 rs +Ethernet1 114 25000 1 9126 rs +Ethernet2 115 25000 2 9126 rs +Ethernet3 116 25000 3 9126 rs +Ethernet4 117 25000 4 9126 rs +Ethernet5 118 25000 5 9126 rs +Ethernet6 119 25000 6 9126 rs +Ethernet7 120 25000 7 9126 rs +Ethernet8 112 25000 8 9126 rs +Ethernet9 111 25000 9 9126 rs +Ethernet10 110 25000 10 9126 rs +Ethernet11 109 25000 11 9126 rs +Ethernet12 108 25000 12 9126 rs +Ethernet13 107 25000 13 9126 rs +Ethernet14 106 25000 14 9126 rs +Ethernet15 105 25000 15 9126 rs +Ethernet16 96 25000 16 9126 rs +Ethernet17 95 25000 17 9126 rs +Ethernet18 94 25000 18 9126 rs +Ethernet19 93 25000 19 9126 rs +Ethernet20 92 25000 20 9126 rs +Ethernet21 91 25000 21 9126 rs +Ethernet22 90 25000 22 9126 rs +Ethernet23 89 25000 23 9126 rs +Ethernet24 42 25000 24 9126 rs +Ethernet25 46 25000 25 9126 rs +Ethernet26 43 25000 26 9126 rs +Ethernet27 44 25000 27 9126 rs +Ethernet28 41 25000 28 9126 rs +Ethernet29 45 25000 29 9126 rs +Ethernet30 48 25000 30 9126 rs +Ethernet31 47 25000 31 9126 rs +Ethernet32 25 25000 32 9126 rs +Ethernet33 26 25000 33 9126 rs +Ethernet34 27 25000 34 9126 rs +Ethernet35 28 25000 35 9126 rs +Ethernet36 29 25000 36 9126 rs +Ethernet37 30 25000 37 9126 rs +Ethernet38 31 25000 38 9126 rs +Ethernet39 32 25000 39 9126 rs +Ethernet40 19 25000 40 9126 rs +Ethernet41 17 25000 41 9126 rs +Ethernet42 21 25000 42 9126 rs +Ethernet43 18 25000 43 9126 rs +Ethernet44 23 25000 44 9126 rs +Ethernet45 20 25000 45 9126 rs +Ethernet46 24 25000 46 9126 rs +Ethernet47 22 25000 47 9126 rs +Ethernet48 77,78,79,80 100000 48 9126 rs +Ethernet49 73,74,75,76 100000 49 9126 rs +Ethernet50 37,38,39,40 100000 50 9126 rs +Ethernet51 33,34,35,36 100000 51 9126 rs +Ethernet52 9,10,11,12 100000 52 9126 rs +Ethernet53 13,14,15,16 100000 53 9126 rs +Ethernet52 1,2,3,4 100000 54 9126 rs +Ethernet52 5,6,7,8 100000 55 9126 rs + diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos.json.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_lossy_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_lossy_t1.j2 new file mode 100755 index 00000000000..f1cd38f28db --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_lossy_t1.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/sai.profile b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/sai.profile new file mode 100755 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_48x25_8x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers.json.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..72a618f07f4 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "46003200", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6f9ed3c7f64 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "34056960", + "type": "ingress", + "mode": "dynamic", + "xoff": "4185600" + }, + "lossy_pool": { + "size": "14595840", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"23001600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"23001600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/config_64x100G_Delta-evs-a-32q56.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/config_64x100G_Delta-evs-a-32q56.yaml new file mode 100755 index 00000000000..e5fbcc93543 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/config_64x100G_Delta-evs-a-32q56.yaml @@ -0,0 +1,653 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KRFEC" + id: "253" + lanes: "4:4" + serdes_group: "31" + speed: "100G" + sysport: "253" + type: "eth" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KRFEC" + id: "245" + lanes: "4:4" + serdes_group: "30" + speed: "100G" + sysport: "245" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KRFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "205" + lanes: "4:4" + serdes_group: "25" + speed: "100G" + sysport: "205" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "197" + lanes: "4:4" + serdes_group: "24" + speed: "100G" + sysport: "197" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "189" + lanes: "4:4" + serdes_group: "23" + speed: "100G" + sysport: "189" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "181" + lanes: "4:4" + serdes_group: "22" + speed: "100G" + sysport: "181" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "173" + lanes: "4:4" + serdes_group: "21" + speed: "100G" + sysport: "173" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "141" + lanes: "4:4" + serdes_group: "17" + speed: "100G" + sysport: "141" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/innovium.77700_B b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/ivm.sai.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..ff1b69d1137 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Delta-evs-a-32q56.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.55300" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/ivm.sai.datapath.config.yaml b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..2dcf88fc955 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,10 @@ +ISAI_PARAM_A000 : "0" +ISAI_PARAM_P0_0_LS : "9216 9216" +ISAI_PARAM_P0_1_LS : "2850 2650" +ISAI_PARAM_P0_1_ALS : "290 90" +ISAI_PARAM_P1_0_LS : "3072 3072" +ISAI_PARAM_P1_0_LL : "6144 6144" +ISAI_PARAM_P1_1_LS : "2210 2010" +ISAI_PARAM_P1_1_LL : "1330 1330" +ISAI_PARAM_P1_1_ALS : "290 90" +ISAI_PARAM_P1_1_ALL : "50 50" diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/pg_profile_lookup.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/port_config.ini b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/port_config.ini new file mode 100644 index 00000000000..9999a677da4 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/port_config.ini @@ -0,0 +1,67 @@ +# name lanes speed index mtu +Ethernet0 249,250,251,252 100000 0 9126 +Ethernet4 253,254,255,256 100000 0 9126 +Ethernet8 241,242,243,244 100000 1 9126 +Ethernet12 245,246,247,248 100000 1 9126 +Ethernet16 233,234,235,236 100000 2 9126 +Ethernet20 237,238,239,240 100000 2 9126 +Ethernet24 225,226,227,228 100000 3 9126 +Ethernet28 229,230,231,232 100000 3 9126 +Ethernet32 217,218,219,220 100000 4 9126 +Ethernet36 221,222,223,224 100000 4 9126 +Ethernet40 209,210,211,212 100000 5 9126 +Ethernet44 213,214,215,216 100000 5 9126 +Ethernet48 201,202,203,204 100000 6 9126 +Ethernet52 205,206,207,208 100000 6 9126 +Ethernet56 193,194,195,196 100000 7 9126 +Ethernet60 197,198,199,200 100000 7 9126 +Ethernet64 185,186,187,188 100000 8 9126 +Ethernet68 189,190,191,192 100000 8 9126 +Ethernet72 177,178,179,180 100000 9 9126 +Ethernet76 181,182,183,184 100000 9 9126 +Ethernet80 169,170,171,172 100000 10 9126 +Ethernet84 173,174,175,176 100000 10 9126 +Ethernet88 161,162,163,164 100000 11 9126 +Ethernet92 165,166,167,168 100000 11 9126 +Ethernet96 153,154,155,156 100000 12 9126 +Ethernet100 157,158,159,160 100000 12 9126 +Ethernet104 145,146,147,148 100000 13 9126 +Ethernet108 149,150,151,152 100000 13 9126 +Ethernet112 137,138,139,140 100000 14 9126 +Ethernet116 141,142,143,144 100000 14 9126 +Ethernet120 129,130,131,132 100000 15 9126 +Ethernet124 133,134,135,136 100000 15 9126 +Ethernet128 121,122,123,124 100000 16 9126 +Ethernet132 125,126,127,128 100000 16 9126 +Ethernet136 113,114,115,116 100000 17 9126 +Ethernet140 117,118,119,120 100000 17 9126 +Ethernet144 97,98,99,100 100000 18 9126 +Ethernet148 101,102,103,104 100000 18 9126 +Ethernet152 105,106,107,108 100000 19 9126 +Ethernet156 109,110,111,112 100000 19 9126 +Ethernet160 81,82,83,84 100000 20 9126 +Ethernet164 85,86,87,88 100000 20 9126 +Ethernet168 89,90,91,92 100000 21 9126 +Ethernet172 93,94,95,96 100000 21 9126 +Ethernet176 65,66,67,68 100000 22 9126 +Ethernet180 69,70,71,72 100000 22 9126 +Ethernet184 73,74,75,76 100000 23 9126 +Ethernet188 77,78,79,80 100000 23 9126 +Ethernet192 49,50,51,52 100000 24 9126 +Ethernet196 53,54,55,56 100000 24 9126 +Ethernet200 57,58,59,60 100000 25 9126 +Ethernet204 61,62,63,64 100000 25 9126 +Ethernet208 33,34,35,36 100000 26 9126 +Ethernet212 37,38,39,40 100000 26 9126 +Ethernet216 41,42,43,44 100000 27 9126 +Ethernet220 45,46,47,48 100000 27 9126 +Ethernet224 17,18,19,20 100000 28 9126 +Ethernet228 21,22,23,24 100000 28 9126 +Ethernet232 25,26,27,28 100000 29 9126 +Ethernet236 29,30,31,32 100000 29 9126 +Ethernet240 1,2,3,4 100000 30 9126 +Ethernet244 5,6,7,8 100000 30 9126 +Ethernet248 9,10,11,12 100000 31 9126 +Ethernet252 13,14,15,16 100000 31 9126 +Ethernet256 257 10000 32 9126 +Ethernet257 258 10000 33 9126 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos.json.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos.json.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos_defaults_def_lossy.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos_defaults_t1.j2 b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos_defaults_t1.j2 new file mode 100644 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/sai.profile b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/sai.profile new file mode 100755 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/Delta-evs-a-32q56_64x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/default_sku b/device/delta/x86_64-delta_evs-a-32q56-r0/default_sku new file mode 100644 index 00000000000..c52a1e4d3fc --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/default_sku @@ -0,0 +1 @@ +Delta-evs-a-32q56_32x100 t1 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/installer.conf b/device/delta/x86_64-delta_evs-a-32q56-r0/installer.conf new file mode 100644 index 00000000000..925a32fc0c3 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/led_proc_init.soc b/device/delta/x86_64-delta_evs-a-32q56-r0/led_proc_init.soc new file mode 100644 index 00000000000..4173de277f6 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/led_proc_init.soc @@ -0,0 +1,10 @@ +#ET_C032IF Port_Remap +# Vlan set and port enable + +# led0 port order remap + +#ET_C032IF_LED + +#-------------------------------------------------------------------------------------------------- +#LED Auto link/up + diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/eeprom.py b/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/eeprom.py new file mode 100644 index 00000000000..66767323995 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# 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: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, 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 = "/sys/class/i2c-adapter/i2c-0/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 2048, '', True) diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/psuutil.py b/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/psuutil.py new file mode 100644 index 00000000000..88300af1a2c --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/psuutil.py @@ -0,0 +1,75 @@ +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# + +try: + import os.path + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + self.psu_status = "ipmitool raw 0x06 0x52 0x07 0x62 0x01 0x21" + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 0 + try: + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x62 0x01 0x23").readline().strip() + reg_value = int(content, 16) + mask = (1 << (index - 1)) + if reg_value & mask == 0: + status = 0 + else: + status = 1 + except IOError: + return False + return status == 1 + + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + status = 0 + try: + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x62 0x01 0x21").readline().strip() + reg_value = int(content, 16) + mask = (1 << (index - 1)) + if reg_value & mask != 0: + status = 0 + else: + status = 1 + except IOError: + return False + return status == 1 + diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/sfputil.py b/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/sfputil.py new file mode 100644 index 00000000000..ddb389230e9 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/plugins/sfputil.py @@ -0,0 +1,195 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import os.path + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_START_SFP = 32 + PORT_END = 33 + PORTS_IN_BLOCK = 34 + + _port_to_eeprom_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def port_start_sfp(self): + return self.PORT_START_SFP + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/bus/i2c/devices/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): + if x >= self.port_start_sfp: + # SFP1: 41-0050, SFP2: 42-0050 + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + 9) + else: + # QSFP1: 51-0050 ~ QSFP32: 82-0050 + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + 51) + + # self.modprs_register = self.get_transceiver_status + 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 + + if port_num < 16 or port_num >= self.port_start_sfp: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x01") + else: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x10") + + if port_num >= self.port_start_sfp: + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x01").readline().strip() + else: + if ((port_num / 8) % 2 == 0): + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x08").readline().strip() + else: + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x09").readline().strip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (port_num % 8)) + + # 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 - 2: + return False + + if port_num < 16: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x01") + else: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x10") + + if ((port_num / 8) % 2 == 0): + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x12").readline().strip() + else: + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x13").readline().strip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (port_num % 8)) + + # 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 - 2: + return False + + if port_num < 16: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x01") + else: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x10") + + if ((port_num / 8) % 2 == 0): + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x12").readline().strip() + else: + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x13").readline().strip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (port_num % 8)) + + # 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 + content = hex(reg_value).rstrip("L") or "0" + if ((port_num / 8) % 2 == 0): + os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x00 0x12 {0}".format(content)) + else: + os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x00 0x13 {0}".format(content)) + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end - 2: + return False + + if port_num < 16: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x01") + else: + os.popen("ipmitool raw 0x06 0x52 0x07 0xe2 0x01 0x10") + + if ((port_num / 8) % 2 == 0): + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x06").readline().strip() + else: + content = os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x01 0x07").readline().strip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (port_num % 8)) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + if ((port_num / 8) % 2 == 0): + os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x00 0x06 {0}".format(hex(reg_value))) + else: + os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x00 0x07 {0}".format(hex(reg_value))) + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + reg_value = reg_value | mask + if ((port_num / 8) % 2 == 0): + os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x00 0x06 {0}".format(hex(reg_value))) + else: + os.popen("ipmitool raw 0x06 0x52 0x07 0x64 0x00 0x07 {0}".format(hex(reg_value))) + + return True + + def get_transceiver_change_event(self, timeout=0): + + return False, {} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/pmon_daemon_control.json b/device/delta/x86_64-delta_evs-a-32q56-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..f490a4dc0f3 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_thermalctld": true +} diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/sensors.conf b/device/delta/x86_64-delta_evs-a-32q56-r0/sensors.conf new file mode 100644 index 00000000000..db34a541b26 --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/sensors.conf @@ -0,0 +1,4 @@ +# libsensors configuration file for DELTA-ET-C032IF +# ------------------------------------------------ +# + diff --git a/device/delta/x86_64-delta_evs-a-32q56-r0/topo.conf b/device/delta/x86_64-delta_evs-a-32q56-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/delta/x86_64-delta_evs-a-32q56-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile b/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile index b5586b7ba24..426284150a0 100644 --- a/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile +++ b/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-wedge100-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile index 42315ee4ea6..3205cd2d6ad 100644 --- a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td2-s8810-32x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile index 29db3ecd162..607f20f329a 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-s8900-48x25G+6x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile index 77a0e3efa43..1100f7199a3 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-s8900-48x25G+16x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile index 14a36af5f55..11c0ae1ab63 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-s9100-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile index 5404ca338ff..d16307aa360 100644 --- a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-s9200-64x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/sai.profile b/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/sai.profile index dca8c2f68c0..768a7fa47ad 100644 --- a/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/sai.profile +++ b/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th2-qfx5210-64x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/th2-qfx5210-64x100G.config.bcm b/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/th2-qfx5210-64x100G.config.bcm index bc421a4e515..4d6e2f988c6 100644 --- a/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/th2-qfx5210-64x100G.config.bcm +++ b/device/juniper/x86_64-juniper_qfx5210-r0/Juniper-QFX5210-64C/th2-qfx5210-64x100G.config.bcm @@ -14,7 +14,7 @@ pbmp_oversubscribe=0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff # platform specific setting arl_clean_timeout_usec=15000000 asf_mem_profile=2 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_flags=1 bcm_stat_jumbo=9236 cdma_timeout_usec=15000000 diff --git a/device/juniper/x86_64-juniper_qfx5210-r0/plugins/sfputil.py b/device/juniper/x86_64-juniper_qfx5210-r0/plugins/sfputil.py index 59b1dfdb587..4f584d6a32a 100644 --- a/device/juniper/x86_64-juniper_qfx5210-r0/plugins/sfputil.py +++ b/device/juniper/x86_64-juniper_qfx5210-r0/plugins/sfputil.py @@ -368,14 +368,14 @@ def get_transceiver_info_dict(self, port_num): transceiver_info_dict['type'] = sfp_type_data['data']['type']['value'] transceiver_info_dict['type_abbrv_name'] = sfp_type_data['data']['type_abbrv_name']['value'] - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data['data']['Vendor Name']['value'] - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] # Below part is added to avoid fail the xcvrd, shall be implemented later transceiver_info_dict['vendor_oui'] = 'N/A' transceiver_info_dict['vendor_date'] = 'N/A' - transceiver_info_dict['Connector'] = 'N/A' + transceiver_info_dict['connector'] = 'N/A' transceiver_info_dict['encoding'] = 'N/A' transceiver_info_dict['ext_identifier'] = 'N/A' transceiver_info_dict['ext_rateselect_compliance'] = 'N/A' @@ -470,13 +470,13 @@ def get_transceiver_info_dict(self, port_num): transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value'] - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data['data']['Vendor Name']['value'] - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] - transceiver_info_dict['Connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/sai_2010.xml b/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/sai_2010.xml index 34151a434a2..3383a5f406e 100644 --- a/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/sai_2010.xml +++ b/device/mellanox/x86_64-mlnx_msn2010-r0/ACS-MSN2010/sai_2010.xml @@ -21,7 +21,7 @@ 0 - + 939524096 diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn2010-r0/platform_components.json index 775c6e22cf5..a5cd5b152c4 100644 --- a/device/mellanox/x86_64-mlnx_msn2010-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn2010-r0/platform_components.json @@ -1,9 +1,12 @@ { "chassis": { - "x86_64-mlnx_msn2010-r0": { + "MSN2010": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2010-r0/sensors.conf index 3b68f775df2..7f5b023afec 100644 --- a/device/mellanox/x86_64-mlnx_msn2010-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn2010-r0/sensors.conf @@ -1,92 +1,49 @@ +################################################################################ +# Copyright (c) 2020 Mellanox Technologies +# +# Platform specific sensors config for SN2010 +################################################################################ + +# Temperature sensors bus "i2c-2" "i2c-1-mux (chan_id 1)" -chip "mlxsw-i2c-2-48" - label temp1 "ASIC Temp" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" bus "i2c-7" "i2c-1-mux (chan_id 6)" -chip "lm75-*" - label temp1 "Ambient Port Temp" + chip "lm75-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + chip "lm75-i2c-*-4b" + label temp1 "Ambient Fan Side Temp (air intake)" +# Power supplies bus "i2c-5" "i2c-1-mux (chan_id 4)" -chip "tps53679-*" - label vin "TPS vin" - label vout1 "TPS vout1" - label vout2 "TPS vout2" - label temp1 "TPS Temp1" - label temp2 "TPS Temp2" - label pout1 "TPS pouti1" - label pout2 "TPS pout2" - label iout1 "TPS iout1" - label iout2 "TPS iout2" - -chip "mlxsw-*" - ignore temp2 - ignore temp3 - ignore temp4 - ignore temp5 - ignore temp6 - ignore temp7 - ignore temp8 - ignore temp9 - ignore temp10 - ignore temp11 - ignore temp12 - ignore temp13 - ignore temp14 - ignore temp15 - ignore temp16 - ignore temp17 - ignore temp18 - ignore temp19 - ignore temp20 - ignore temp21 - ignore temp22 - ignore temp23 - ignore temp24 - ignore temp25 - ignore temp26 - ignore temp27 - ignore temp28 - ignore temp29 - ignore temp30 - ignore temp31 - ignore temp32 - ignore temp33 - ignore temp34 - ignore temp35 - ignore temp36 - ignore temp37 - ignore temp38 - ignore temp39 - ignore temp40 - ignore temp41 - ignore temp42 - ignore temp43 - ignore temp44 - ignore temp45 - ignore temp46 - ignore temp47 - ignore temp48 - ignore temp49 - ignore temp50 - ignore temp51 - ignore temp52 - ignore temp53 - ignore temp54 - ignore temp55 - ignore temp56 - ignore temp57 - ignore temp58 - ignore temp59 - ignore temp60 - ignore temp61 - ignore temp62 - ignore temp63 - ignore temp64 + chip "tps53679-i2c-*-70" + label in1 "PMIC-1 PSU 12V Rail (in1)" + label in2 "PMIC-1 PSU 12V Rail (in2)" + label in3 "PMIC-1 0.9V VCORE (out)" + label in4 "PMIC-1 1.2V Rail (out)" + label temp1 "PMIC-1 Temp 1" + label temp2 "PMIC-1 Temp 2" + label power1 "PMIC-1 0.9V VCORE Pwr (out)" + label power2 "PMIC-1 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 0.9V VCORE Curr (out)" + label curr2 "PMIC-1 1.2V Rail Curr (out)" + chip "tps53679-i2c-*-71" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-2 2.2V Rail (out)" + ignore in4 + label temp1 "PMIC-2 Temp 1" + label temp2 "PMIC-2 Temp 2" + label power1 "PMIC-2 2.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-2 2.2V Rail Curr (out)" + ignore curr2 -chip "*-virtual-*" - ignore temp1 - ignore temp2 - -chip "dps460-*" - ignore fan2 - ignore fan3 +# Chassis fans +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label fan1 "Chassis Fan 1" + label fan2 "Chassis Fan 2" + label fan3 "Chassis Fan 3" + label fan4 "Chassis Fan 4" diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai_2100.xml b/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai_2100.xml index c9b844cd4bf..3d16fe89629 100644 --- a/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai_2100.xml +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai_2100.xml @@ -18,7 +18,7 @@ 3 - + 98368 diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn2100-r0/platform_components.json index 6a6a74301cb..b8936fa3ad4 100644 --- a/device/mellanox/x86_64-mlnx_msn2100-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/platform_components.json @@ -1,9 +1,12 @@ { "chassis": { - "x86_64-mlnx_msn2100-r0": { + "MSN2100": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf deleted file mode 120000 index ea04d66d008..00000000000 --- a/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700-r0/sensors.conf \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf new file mode 100644 index 00000000000..e37dd25f03d --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf @@ -0,0 +1,51 @@ +################################################################################ +# Copyright (c) 2020 Mellanox Technologies +# +# Platform specific sensors config for SN2100 +################################################################################ + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "lm75-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + chip "lm75-i2c-*-4b" + label temp1 "Ambient Fan Side Temp (air intake)" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "pmbus-i2c-*-41" + label in1 "PMB-1 12V Rail (in)" + label in2 "PMB-1 0.9V Rail (out)" + label in3 "PMB-1 1.8V Rail (out)" + label temp1 "PMB-1 Temp 1" + label temp2 "PMB-1 Temp 2" + ignore power1 + label power2 "PMB-1 0.9V Rail Pwr (out)" + label power3 "PMB-1 1.8V Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-1 0.9V Rail Curr (out)" + label curr3 "PMB-1 1.8V Rail Curr (out)" + chip "pmbus-i2c-*-27" + label in1 "PMB-2 12V Rail (in)" + label in2 "PMB-2 3.3V Rail (out)" + label in3 "PMB-2 1.2V Rail (out)" + label temp1 "PMB-2 Temp 1" + label temp2 "PMB-2 Temp 2" + ignore power1 + label power2 "PMB-2 3.3V Rail Pwr (out)" + label power3 "PMB-2 1.2V Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-2 3.3V Rail Curr (out)" + label curr3 "PMB-2 1.2V Rail Curr (out)" + +# Chassis fans +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label fan1 "Chassis Fan 1" + label fan2 "Chassis Fan 2" + label fan3 "Chassis Fan 3" + label fan4 "Chassis Fan 4" diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai_2410.xml b/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai_2410.xml index 4884cd754a3..03d694c9772 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai_2410.xml +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai_2410.xml @@ -21,7 +21,7 @@ 0 - + 939524096 diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn2410-r0/platform_components.json index 77da35ce581..52c09f4ea99 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/platform_components.json @@ -1,9 +1,13 @@ { "chassis": { - "x86_64-mlnx_msn2410-r0": { + "MSN2410": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { }, + "CPLD3": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf deleted file mode 120000 index ea04d66d008..00000000000 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700-r0/sensors.conf \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf new file mode 100644 index 00000000000..ede1fbe3c76 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf @@ -0,0 +1,81 @@ +################################################################################ +# Copyright (c) 2020 Mellanox Technologies +# +# Platform specific sensors config for SN2410 +################################################################################ + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 7)" + chip "lm75-i2c-7-4a" + label temp1 "Ambient Port Temp" + +bus "i2c-17" "i2c-1-mux (chan_id 17)" + chip "lm75-i2c-17-49" + label temp1 "Ambient Fan Temp" + +chip "acpitz-virtual-0" + label temp1 "ACPI CPU Temp" + label temp2 "ACPI Board Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 5)" + chip "pmbus-i2c-*-41" + label in1 "PMB-1 PSU 12V Rail (in)" + label in2 "PMB-1 0.9V VCORE Rail (out)" + label temp1 "PMB-1 Temp 1" + label temp2 "PMB-1 Temp 2" + ignore power1 + label power2 "PMB-1 0.9V VCORE Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-1 0.9V VCORE Rail Curr (out)" + chip "pmbus-i2c-*-27" + label in1 "PMB-2 PSU 12V Rail (in)" + label in2 "PMB-2 3.3V Rail (out)" + label in3 "PMB-2 1.2V Rail (out)" + label temp1 "PMB-2 Temp 1" + label temp2 "PMB-2 Temp 2" + ignore power1 + label power2 "PMB-2 3.3V Rail Pwr (out)" + label power3 "PMB-2 1.2V Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-2 3.3V Rail Curr (out)" + label curr3 "PMB-2 1.2V Rail Curr (out)" + +# Power supplies +bus "i2c-10" "i2c-1-mux (chan_id 10)" + chip "dps460-i2c-*-58" + label in1 "PSU-2(R) 220V Rail (in)" + label in2 "PSU-2(R) 12V Rail (out)" + label fan1 "PSU-2(R) Fan 1" + label temp1 "PSU-2(R) Temp 1" + label temp2 "PSU-2(R) Temp 2" + label power1 "PSU-2(R) 220V Rail Pwr (in)" + label power2 "PSU-2(R) 12V Rail Pwr (out)" + label curr1 "PSU-2(R) 220V Rail Curr (in)" + label curr2 "PSU-2(R) 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-1(L) 220V Rail (in)" + label in2 "PSU-1(L) 12V Rail (out)" + label fan1 "PSU-1(L) Fan 1" + label temp1 "PSU-1(L) Temp 1" + label temp2 "PSU-1(L) Temp 2" + label power1 "PSU-1(L) 220V Rail Pwr (in)" + label power2 "PSU-1(L) 12V Rail Pwr (out)" + label curr1 "PSU-1(L) 220V Rail Curr (in)" + label curr2 "PSU-1(L) 12V Rail Curr (out)" + +# Chassis fans +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label fan1 "Chassis Drawer-1 Fan-1" + label fan2 "Chassis Drawer-1 Fan-2" + label fan3 "Chassis Drawer-2 Fan-1" + label fan4 "Chassis Drawer-2 Fan-2" + label fan5 "Chassis Drawer-3 Fan-1" + label fan6 "Chassis Drawer-3 Fan-2" + label fan7 "Chassis Drawer-4 Fan-1" + label fan8 "Chassis Drawer-4 Fan-2" diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t0.j2 index 5529ee3d859..b8f7d070919 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t0.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t0.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '5029836' %} -{% set ingress_lossy_pool_size = '5029836' %} -{% set egress_lossless_pool_size = '14024599' %} -{% set egress_lossy_pool_size = '5029836' %} +{% set ingress_lossless_pool_size = '4580864' %} +{% set ingress_lossy_pool_size = '4580864' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '4580864' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t1.j2 index f418e2ffa1d..a8d32205607 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t1.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers_defaults_t1.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '2097100' %} -{% set ingress_lossy_pool_size = '2097100' %} -{% set egress_lossless_pool_size = '14024599' %} -{% set egress_lossy_pool_size = '2097100' %} +{% set ingress_lossless_pool_size = '3302912' %} +{% set ingress_lossy_pool_size = '3302912' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '3302912' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/pg_profile_lookup.ini index b66b129fe43..7abb2a058d1 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/pg_profile_lookup.ini @@ -1,17 +1,17 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold - 10000 5m 34816 18432 16384 0 - 25000 5m 34816 18432 16384 0 - 40000 5m 34816 18432 16384 0 - 50000 5m 34816 18432 16384 0 - 100000 5m 36864 18432 18432 0 - 10000 40m 36864 18432 18432 0 - 25000 40m 39936 18432 21504 0 - 40000 40m 41984 18432 23552 0 - 50000 40m 41984 18432 23552 0 - 100000 40m 54272 18432 35840 0 - 10000 300m 49152 18432 30720 0 - 25000 300m 71680 18432 53248 0 - 40000 300m 94208 18432 75776 0 - 50000 300m 94208 18432 75776 0 - 100000 300m 184320 18432 165888 0 +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 49152 19456 29696 0 + 25000 5m 49152 19456 29696 0 + 40000 5m 49152 19456 29696 0 + 50000 5m 49152 19456 29696 0 + 100000 5m 50176 19456 30720 0 + 10000 40m 49152 19456 29696 0 + 25000 40m 51200 19456 31744 0 + 40000 40m 52224 19456 32768 0 + 50000 40m 53248 19456 33792 0 + 100000 40m 58368 19456 38912 0 + 10000 300m 56320 19456 36864 0 + 25000 300m 67584 19456 48128 0 + 40000 300m 78848 19456 59392 0 + 50000 300m 86016 19456 66560 0 + 100000 300m 123904 19456 104448 0 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai_2700.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai_2700.xml index eedf359fb88..f025df1d3ef 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai_2700.xml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai_2700.xml @@ -21,7 +21,7 @@ 3 - + 98368 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 deleted file mode 120000 index 9f12504c7c5..00000000000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 +++ /dev/null @@ -1 +0,0 @@ -ACS-MSN2700 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t0.j2 index a722094938f..a1d24c418b3 120000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t0.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t0.j2 @@ -1 +1 @@ -../ACS-MSN2700/buffers_defaults_t0.j2 \ No newline at end of file +../Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t1.j2 index b02d5e0194a..bef0c9d9531 120000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t1.j2 +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/buffers_defaults_t1.j2 @@ -1 +1 @@ -../ACS-MSN2700/buffers_defaults_t1.j2 \ No newline at end of file +../Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/pg_profile_lookup.ini index 229a556f88a..40ad66c7356 120000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/pg_profile_lookup.ini @@ -1 +1 @@ -../ACS-MSN2700/pg_profile_lookup.ini \ No newline at end of file +../Mellanox-SN2700-D48C8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/sai_2700_8x50g_28x100g.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/sai_2700_8x50g_28x100g.xml index ee20db3e5dd..3127518b21a 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/sai_2700_8x50g_28x100g.xml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-C28D8/sai_2700_8x50g_28x100g.xml @@ -21,7 +21,7 @@ 3 - + 11534336 @@ -106,7 +106,7 @@ 4 28 3 - 3221225472 + 3221487616 2 @@ -114,7 +114,7 @@ 4 29 1 - 3221225472 + 3221487616 2 @@ -122,7 +122,7 @@ 4 30 3 - 3221225472 + 3221487616 2 @@ -130,7 +130,7 @@ 4 31 1 - 3221225472 + 3221487616 2 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers.json.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers.json.j2 new file mode 120000 index 00000000000..30c4e1d5bfd --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers.json.j2 @@ -0,0 +1 @@ +../ACS-MSN2700/buffers.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers_defaults_t0.j2 new file mode 120000 index 00000000000..a1d24c418b3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers_defaults_t0.j2 @@ -0,0 +1 @@ +../Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers_defaults_t1.j2 new file mode 120000 index 00000000000..bef0c9d9531 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/buffers_defaults_t1.j2 @@ -0,0 +1 @@ +../Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/pg_profile_lookup.ini new file mode 100644 index 00000000000..cdd674e4e71 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 19456 19456 22528 0 + 25000 5m 19456 19456 22528 0 + 40000 5m 19456 19456 22528 0 + 50000 5m 19456 19456 22528 0 + 100000 5m 19456 19456 23552 0 + 10000 40m 19456 19456 22528 0 + 25000 40m 19456 19456 24576 0 + 40000 40m 19456 19456 25600 0 + 50000 40m 19456 19456 25600 0 + 100000 40m 19456 19456 29696 0 + 10000 300m 19456 19456 27648 0 + 25000 300m 19456 19456 36864 0 + 40000 300m 19456 19456 45056 0 + 50000 300m 19456 19456 50176 0 + 100000 300m 19456 19456 78848 0 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/port_config.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/port_config.ini new file mode 100644 index 00000000000..b4072ceb32a --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/port_config.ini @@ -0,0 +1,57 @@ +# name lanes alias index speed +Ethernet0 0 etp1a 1 10000 +Ethernet1 1 etp1b 1 10000 +Ethernet2 2 etp1c 1 10000 +Ethernet3 3 etp1d 1 10000 +Ethernet8 8 etp3a 3 10000 +Ethernet9 9 etp3b 3 10000 +Ethernet10 10 etp3c 3 10000 +Ethernet11 11 etp3d 3 10000 +Ethernet16 16,17 etp5a 5 50000 +Ethernet18 18,19 etp5b 5 50000 +Ethernet20 20,21 etp6a 6 50000 +Ethernet22 22,23 etp6b 6 50000 +Ethernet24 24,25,26,27 etp7 7 100000 +Ethernet28 28,29,30,31 etp8 8 100000 +Ethernet32 32,33,34,35 etp9 9 100000 +Ethernet36 36,37,38,39 etp10 10 100000 +Ethernet40 40,41 etp11a 11 50000 +Ethernet42 42,43 etp11b 11 50000 +Ethernet44 44,45 etp12a 12 50000 +Ethernet46 46,47 etp12b 12 50000 +Ethernet48 48,49 etp13a 13 50000 +Ethernet50 50,51 etp13b 13 50000 +Ethernet52 52,53 etp14a 14 50000 +Ethernet54 54,55 etp14b 14 50000 +Ethernet56 56,57 etp15a 15 50000 +Ethernet58 58,59 etp15b 15 50000 +Ethernet60 60,61 etp16a 16 50000 +Ethernet62 62,63 etp16b 16 50000 +Ethernet64 64,65 etp17a 17 50000 +Ethernet66 66,67 etp17b 17 50000 +Ethernet68 68,69 etp18a 18 50000 +Ethernet70 70,71 etp18b 18 50000 +Ethernet72 72,73 etp19a 19 50000 +Ethernet74 74,75 etp19b 19 50000 +Ethernet76 76,77 etp20a 20 50000 +Ethernet78 78,79 etp20b 20 50000 +Ethernet80 80,81 etp21a 21 50000 +Ethernet82 82,83 etp21b 21 50000 +Ethernet84 84,85 etp22a 22 50000 +Ethernet86 86,87 etp22b 22 50000 +Ethernet88 88,89,90,91 etp23 23 100000 +Ethernet92 92,93,94,95 etp24 24 100000 +Ethernet96 96,97,98,99 etp25 25 100000 +Ethernet100 100,101,102,103 etp26 26 100000 +Ethernet104 104,105 etp27a 27 50000 +Ethernet106 106,107 etp27b 27 50000 +Ethernet108 108,109 etp28a 28 50000 +Ethernet110 110,111 etp28b 28 50000 +Ethernet112 112,113 etp29a 29 50000 +Ethernet114 114,115 etp29b 29 50000 +Ethernet116 116,117 etp30a 30 50000 +Ethernet118 118,119 etp30b 30 50000 +Ethernet120 120,121 etp31a 31 50000 +Ethernet122 122,123 etp31b 31 50000 +Ethernet124 124,125 etp32a 32 50000 +Ethernet126 126,127 etp32b 32 50000 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/qos.json.j2 new file mode 100644 index 00000000000..3e548325ea3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/sai.profile b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/sai.profile new file mode 100644 index 00000000000..a98e620cfa1 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_2700_8x100g_40x50g_8x10g.xml diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/sai_2700_8x100g_40x50g_8x10g.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/sai_2700_8x100g_40x50g_8x10g.xml new file mode 100644 index 00000000000..2e392840d89 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D40C8S8/sai_2700_8x100g_40x50g_8x10g.xml @@ -0,0 +1,269 @@ + + + + + + 00:02:03:04:05:00 + + + 1 + + + 32 + + + + + 1 + 2 + 4 + 16 + + + 3 + + + 3221487616 + + + 3 + 2 + 4 + 17 + 1 + 3221487616 + + + 5 + 2 + 4 + 18 + 3 + 3221487616 + + + 7 + 2 + 4 + 19 + 1 + 3221487616 + + + 9 + 2 + 4 + 20 + 3 + 3221487616 + + + 11 + 2 + 4 + 21 + 1 + 3221487616 + + + 13 + 4 + 22 + 3 + 11534336 + + + 15 + 4 + 23 + 1 + 11534336 + + + 17 + 4 + 24 + 3 + 11534336 + + + 19 + 4 + 25 + 1 + 11534336 + + + 21 + 2 + 4 + 26 + 3 + 3221487616 + + + 23 + 2 + 4 + 27 + 1 + 3221487616 + + + 25 + 2 + 4 + 28 + 3 + 3221487616 + + + 27 + 2 + 4 + 29 + 1 + 3221487616 + + + 29 + 2 + 4 + 30 + 3 + 3221487616 + + + 31 + 2 + 4 + 31 + 1 + 3221487616 + + + 33 + 2 + 4 + 14 + 3 + 3221487616 + + + 35 + 2 + 4 + 15 + 1 + 3221487616 + + + 37 + 2 + 4 + 12 + 3 + 3221487616 + + + 39 + 2 + 4 + 13 + 1 + 3221487616 + + + 41 + 2 + 4 + 10 + 3 + 3221487616 + + + 43 + 2 + 4 + 11 + 1 + 3221487616 + + + 45 + 4 + 8 + 3 + 11534336 + + + 47 + 4 + 9 + 1 + 11534336 + + + 49 + 2 + 4 + 6 + 3 + 3221487616 + + + 51 + 4 + 7 + 1 + 11534336 + + + 53 + 2 + 4 + 4 + 3 + 3221487616 + + + 55 + 2 + 4 + 5 + 1 + 3221487616 + + + 57 + 4 + 4 + 2 + 3 + 28700 + + + 59 + 4 + 3 + 1 + 11534336 + + + 61 + 4 + 4 + 0 + 3 + 28700 + + + 63 + 4 + 1 + 1 + 11534336 + + + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers.json.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers.json.j2 new file mode 120000 index 00000000000..30c4e1d5bfd --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers.json.j2 @@ -0,0 +1 @@ +../ACS-MSN2700/buffers.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..dbebc858bf7 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers_defaults_t0.j2 @@ -0,0 +1,133 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + 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 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '6822912' %} +{% set ingress_lossless_pool_xoff = '999424' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '6822912' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(2,6) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(10,22) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(26,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(0,2) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(6,10) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(22,26) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..561d4842868 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/buffers_defaults_t1.j2 @@ -0,0 +1,133 @@ +{# + Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. + Apache-2.0 + 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 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +#} +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '6282240' %} +{% set ingress_lossless_pool_xoff = '1540096' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '6282240' %} + +{%- macro generate_port_lists(PORT_ALL) %} + {# Generate list of ports #} + {%- for port_idx in range(2,6) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(10,22) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(26,32) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4 + 2)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(0,2) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(6,10) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} + {%- for port_idx in range(22,26) %} + {%- if PORT_ALL.append("Ethernet%d" % (port_idx * 4)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/pg_profile_lookup.ini new file mode 120000 index 00000000000..b1f8524ff2e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/pg_profile_lookup.ini @@ -0,0 +1 @@ +../Mellanox-SN2700-D40C8S8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/port_config.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/port_config.ini new file mode 100644 index 00000000000..53cdc5247da --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/port_config.ini @@ -0,0 +1,55 @@ +# name lanes alias index speed +Ethernet0 0,1,2,3 etp1 1 100000 +Ethernet4 4,5,6,7 etp2 2 100000 +Ethernet8 8,9 etp3a 3 50000 +Ethernet10 10,11 etp3b 3 50000 +Ethernet12 12,13 etp4a 4 50000 +Ethernet14 14,15 etp4b 4 50000 +Ethernet16 16,17 etp5a 5 50000 +Ethernet18 18,19 etp5b 5 50000 +Ethernet20 20,21 etp6a 6 50000 +Ethernet22 22,23 etp6b 6 50000 +Ethernet24 24,25,26,27 etp7 7 100000 +Ethernet28 28,29,30,31 etp8 8 100000 +Ethernet32 32,33,34,35 etp9 9 100000 +Ethernet36 36,37,38,39 etp10 10 100000 +Ethernet40 40,41 etp11a 11 50000 +Ethernet42 42,43 etp11b 11 50000 +Ethernet44 44,45 etp12a 12 50000 +Ethernet46 46,47 etp12b 12 50000 +Ethernet48 48,49 etp13a 13 50000 +Ethernet50 50,51 etp13b 13 50000 +Ethernet52 52,53 etp14a 14 50000 +Ethernet54 54,55 etp14b 14 50000 +Ethernet56 56,57 etp15a 15 50000 +Ethernet58 58,59 etp15b 15 50000 +Ethernet60 60,61 etp16a 16 50000 +Ethernet62 62,63 etp16b 16 50000 +Ethernet64 64,65 etp17a 17 50000 +Ethernet66 66,67 etp17b 17 50000 +Ethernet68 68,69 etp18a 18 50000 +Ethernet70 70,71 etp18b 18 50000 +Ethernet72 72,73 etp19a 19 50000 +Ethernet74 74,75 etp19b 19 50000 +Ethernet76 76,77 etp20a 20 50000 +Ethernet78 78,79 etp20b 20 50000 +Ethernet80 80,81 etp21a 21 50000 +Ethernet82 82,83 etp21b 21 50000 +Ethernet84 84,85 etp22a 22 50000 +Ethernet86 86,87 etp22b 22 50000 +Ethernet88 88,89,90,91 etp23 23 100000 +Ethernet92 92,93,94,95 etp24 24 100000 +Ethernet96 96,97,98,99 etp25 25 100000 +Ethernet100 100,101,102,103 etp26 26 100000 +Ethernet104 104,105 etp27a 27 50000 +Ethernet106 106,107 etp27b 27 50000 +Ethernet108 108,109 etp28a 28 50000 +Ethernet110 110,111 etp28b 28 50000 +Ethernet112 112,113 etp29a 29 50000 +Ethernet114 114,115 etp29b 29 50000 +Ethernet116 116,117 etp30a 30 50000 +Ethernet118 118,119 etp30b 30 50000 +Ethernet120 120,121 etp31a 31 50000 +Ethernet122 122,123 etp31b 31 50000 +Ethernet124 124,125 etp32a 32 50000 +Ethernet126 126,127 etp32b 32 50000 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/qos.json.j2 new file mode 120000 index 00000000000..8bd2d26567b --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/qos.json.j2 @@ -0,0 +1 @@ +../ACS-MSN2700/qos.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/sai.profile b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/sai.profile new file mode 100644 index 00000000000..40653bb74e3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_2700_44x50g_10x100g.xml diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/sai_2700_44x50g_10x100g.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/sai_2700_44x50g_10x100g.xml new file mode 100644 index 00000000000..c505f0c449e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D44C10/sai_2700_44x50g_10x100g.xml @@ -0,0 +1,269 @@ + + + + + + 00:02:03:04:05:00 + + + 1 + + + 32 + + + + + 1 + 2 + 4 + 16 + + + 3 + + + 3221487616 + + + 3 + 2 + 4 + 17 + 1 + 3221487616 + + + 5 + 2 + 4 + 18 + 3 + 3221487616 + + + 7 + 2 + 4 + 19 + 1 + 3221487616 + + + 9 + 2 + 4 + 20 + 3 + 3221487616 + + + 11 + 2 + 4 + 21 + 1 + 3221487616 + + + 13 + 4 + 22 + 3 + 11534336 + + + 15 + 4 + 23 + 1 + 11534336 + + + 17 + 4 + 24 + 3 + 11534336 + + + 19 + 4 + 25 + 1 + 11534336 + + + 21 + 2 + 4 + 26 + 3 + 3221487616 + + + 23 + 2 + 4 + 27 + 1 + 3221487616 + + + 25 + 2 + 4 + 28 + 3 + 3221487616 + + + 27 + 2 + 4 + 29 + 1 + 3221487616 + + + 29 + 2 + 4 + 30 + 3 + 3221487616 + + + 31 + 2 + 4 + 31 + 1 + 3221487616 + + + 33 + 2 + 4 + 14 + 3 + 3221487616 + + + 35 + 2 + 4 + 15 + 1 + 3221487616 + + + 37 + 2 + 4 + 12 + 3 + 3221487616 + + + 39 + 2 + 4 + 13 + 1 + 3221487616 + + + 41 + 2 + 4 + 10 + 3 + 3221487616 + + + 43 + 2 + 4 + 11 + 1 + 3221487616 + + + 45 + 4 + 8 + 3 + 11534336 + + + 47 + 4 + 9 + 1 + 11534336 + + + 49 + 2 + 4 + 6 + 3 + 3221487616 + + + 51 + 4 + 7 + 1 + 11534336 + + + 53 + 2 + 4 + 4 + 3 + 3221487616 + + + 55 + 2 + 4 + 5 + 1 + 3221487616 + + + 57 + 2 + 4 + 2 + 3 + 3221487616 + + + 59 + 2 + 4 + 3 + 1 + 3221487616 + + + 61 + 4 + 0 + 3 + 11534336 + + + 63 + 4 + 1 + 1 + 11534336 + + + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 deleted file mode 120000 index a722094938f..00000000000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN2700/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..c2bdb607d5a --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t0.j2 @@ -0,0 +1,102 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '7719936' %} +{% set ingress_lossless_pool_xoff = '1032192' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '7719936' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 deleted file mode 120000 index b02d5e0194a..00000000000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN2700/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..6f444b61df4 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/buffers_defaults_t1.j2 @@ -0,0 +1,102 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '9686016' %} +{% set ingress_lossless_pool_xoff = '1179648' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '9686016' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/pg_profile_lookup.ini deleted file mode 120000 index 229a556f88a..00000000000 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/pg_profile_lookup.ini +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN2700/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/pg_profile_lookup.ini new file mode 100644 index 00000000000..b4bb2aaadb9 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/pg_profile_lookup.ini @@ -0,0 +1,22 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 19456 19456 22528 0 + 25000 5m 19456 19456 22528 0 + 40000 5m 19456 19456 22528 0 + 50000 5m 19456 19456 22528 0 + 100000 5m 19456 19456 23552 0 + 10000 40m 19456 19456 22528 0 + 25000 40m 19456 19456 24576 0 + 40000 40m 19456 19456 25600 0 + 50000 40m 19456 19456 25600 0 + 100000 40m 19456 19456 29696 0 + 10000 300m 19456 19456 27648 0 + 25000 300m 19456 19456 36864 0 + 40000 300m 19456 19456 45056 0 + 50000 300m 19456 19456 50176 0 + 100000 300m 19456 19456 78848 0 + 10000 2000m 19456 19456 29696 0 + 25000 2000m 19456 19456 58368 0 + 40000 2000m 19456 19456 87040 0 + 50000 2000m 19456 19456 105472 0 + 100000 2000m 19456 19456 199680 0 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai.profile b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai.profile index bfbcb1e78f4..b1ff086c68a 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_2700_48x50g_8x100g.xml +SAI_VXLAN_SRCPORT_RANGE_ENABLE=1 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai_2700_48x50g_8x100g.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai_2700_48x50g_8x100g.xml index dccb606f743..5d92ffd45e9 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai_2700_48x50g_8x100g.xml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700-D48C8/sai_2700_48x50g_8x100g.xml @@ -21,8 +21,8 @@ 3 - - 3221225472 + + 3221487616 2 @@ -30,7 +30,7 @@ 4 17 1 - 3221225472 + 3221487616 2 @@ -38,7 +38,7 @@ 4 18 3 - 3221225472 + 3221487616 2 @@ -46,7 +46,7 @@ 4 19 1 - 3221225472 + 3221487616 2 @@ -54,7 +54,7 @@ 4 20 3 - 3221225472 + 3221487616 2 @@ -62,7 +62,7 @@ 4 21 1 - 3221225472 + 3221487616 2 @@ -98,7 +98,7 @@ 4 26 3 - 3221225472 + 3221487616 2 @@ -106,7 +106,7 @@ 4 27 1 - 3221225472 + 3221487616 2> @@ -114,7 +114,7 @@ 4 28 3 - 3221225472 + 3221487616 2 @@ -122,7 +122,7 @@ 4 29 1 - 3221225472 + 3221487616 2 @@ -130,7 +130,7 @@ 4 30 3 - 3221225472 + 3221487616 2 @@ -138,7 +138,7 @@ 4 31 1 - 3221225472 + 3221487616 2 @@ -146,7 +146,7 @@ 4 14 3 - 3221225472 + 3221487616 2 @@ -154,7 +154,7 @@ 4 15 1 - 3221225472 + 3221487616 2 @@ -162,7 +162,7 @@ 4 12 3 - 3221225472 + 3221487616 2 @@ -170,7 +170,7 @@ 4 13 1 - 3221225472 + 3221487616 2 @@ -178,7 +178,7 @@ 4 10 3 - 3221225472 + 3221487616 2 @@ -186,7 +186,7 @@ 4 11 1 - 3221225472 + 3221487616 2 @@ -222,7 +222,7 @@ 4 4 3 - 3221225472 + 3221487616 2 @@ -230,7 +230,7 @@ 4 5 1 - 3221225472 + 3221487616 2 @@ -238,7 +238,7 @@ 4 2 3 - 3221225472 + 3221487616 2 @@ -246,7 +246,7 @@ 4 3 1 - 3221225472 + 3221487616 2 @@ -254,7 +254,7 @@ 4 0 3 - 3221225472 + 3221487616 2 @@ -262,7 +262,7 @@ 4 1 1 - 3221225472 + 3221487616 2 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers.json.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers.json.j2 new file mode 120000 index 00000000000..30c4e1d5bfd --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers.json.j2 @@ -0,0 +1 @@ +../ACS-MSN2700/buffers.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..f2bf213b1ae --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers_defaults_t0.j2 @@ -0,0 +1,102 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '10177536' %} +{% set ingress_lossless_pool_xoff = '688128' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '10177536' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..5a56a04fc09 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/buffers_defaults_t1.j2 @@ -0,0 +1,102 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '8719360' %} +{% set ingress_lossless_pool_xoff = '2146304' %} +{% set egress_lossless_pool_size = '13945824' %} +{% set egress_lossy_pool_size = '8719360' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/pg_profile_lookup.ini new file mode 120000 index 00000000000..40ad66c7356 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/pg_profile_lookup.ini @@ -0,0 +1 @@ +../Mellanox-SN2700-D48C8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/port_config.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/port_config.ini new file mode 120000 index 00000000000..75904c15925 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/port_config.ini @@ -0,0 +1 @@ +../ACS-MSN2700/port_config.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/qos.json.j2 new file mode 120000 index 00000000000..8bd2d26567b --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/qos.json.j2 @@ -0,0 +1 @@ +../ACS-MSN2700/qos.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/sai.profile b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/sai.profile new file mode 120000 index 00000000000..5d2c55d8bb4 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/sai.profile @@ -0,0 +1 @@ +../ACS-MSN2700/sai.profile \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/sai_2700.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/sai_2700.xml new file mode 120000 index 00000000000..7f7b65fc6a2 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700/sai_2700.xml @@ -0,0 +1 @@ +../ACS-MSN2700/sai_2700.xml \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_components.json index 2a606941478..33a73547cc3 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_components.json @@ -1,9 +1,13 @@ { "chassis": { - "x86_64-mlnx_msn2700-r0": { + "MSN2700": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { }, + "CPLD3": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py index c9ae1a33542..fbfe0d99ae7 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py @@ -21,7 +21,7 @@ from cStringIO import StringIO from sonic_eeprom import eeprom_base from sonic_eeprom import eeprom_tlvinfo - from sonic_device_util import get_machine_info + from sonic_py_common.device_info import get_machine_info import subprocess except ImportError, e: raise ImportError (str(e) + "- required module not found") diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmget.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmget.py index a4a53fb099f..2f19edfa1a5 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmget.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmget.py @@ -1,43 +1,51 @@ #!/usr/bin/env python +""" +This utility get the power mode of a given module. +""" -import sys, errno -import os -from python_sdk_api.sxd_api import * +import sys +import errno from python_sdk_api.sx_api import * +def mgmt_phy_mod_pwr_attr_get(handle, module_id, power_attr_type): + sx_mgmt_phy_mod_pwr_attr_p = new_sx_mgmt_phy_mod_pwr_attr_t_p() + sx_mgmt_phy_mod_pwr_attr = sx_mgmt_phy_mod_pwr_attr_t() + sx_mgmt_phy_mod_pwr_attr.power_attr_type = power_attr_type + sx_mgmt_phy_mod_pwr_attr_t_p_assign(sx_mgmt_phy_mod_pwr_attr_p, sx_mgmt_phy_mod_pwr_attr) + try: + rc = sx_mgmt_phy_mod_pwr_attr_get(handle, module_id, sx_mgmt_phy_mod_pwr_attr_p) + assert SX_STATUS_SUCCESS == rc, "sx_mgmt_phy_mod_pwr_attr_get failed" + sx_mgmt_phy_mod_pwr_attr = sx_mgmt_phy_mod_pwr_attr_t_p_value(sx_mgmt_phy_mod_pwr_attr_p) + pwr_mode_attr = sx_mgmt_phy_mod_pwr_attr.pwr_mode_attr + return pwr_mode_attr.admin_pwr_mode_e, pwr_mode_attr.oper_pwr_mode_e + finally: + delete_sx_mgmt_phy_mod_pwr_attr_t_p(sx_mgmt_phy_mod_pwr_attr_p) + # Check if SFP port number is provided if len(sys.argv) < 2: - print "SFP module number is missed." - print "Usage: sfplpmget.py " + print("SFP module number is missed.") + print("Usage: sfplpmget.py ") sys.exit(errno.EINVAL) # Init SDK API rc, handle = sx_api_open(None) if (rc != SX_STATUS_SUCCESS): - print "Failed to open api handle.\nPlease check that SDK is running." - sys.exit(errno.EACCES) - -pid = os.getpid() -rc = sxd_access_reg_init(pid, None, 0) -if (rc != 0): - print "Failed to initializing register access.\nPlease check that SDK is running." + print("Failed to open api handle.\nPlease check that SDK is running.") sys.exit(errno.EACCES) # Get SFP module number sfp_module = int(sys.argv[1]) - 1 -# Get MCION -mcion = ku_mcion_reg() -mcion.module = sfp_module -meta = sxd_reg_meta_t() -meta.dev_id = 1 -meta.swid = 0 -meta.access_cmd = SXD_ACCESS_CMD_GET +admin_pwr_mode, oper_pwr_mode = mgmt_phy_mod_pwr_attr_get(handle, sfp_module, SX_MGMT_PHY_MOD_PWR_ATTR_PWR_MODE_E) -rc = sxd_access_reg_mcion(mcion, meta, 1, None, None) -assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_mcion failed, rc = %d" % rc +lpm_status = None +if oper_pwr_mode == SX_MGMT_PHY_MOD_PWR_MODE_HIGH_E: + lpm_status = False +elif oper_pwr_mode == SX_MGMT_PHY_MOD_PWR_MODE_LOW_E: + lpm_status = True +else: + print("LPM UNKNOWN") -# Get low power mode status -lpm_mask = 1 << 8 -lpm_status = (lpm_mask & mcion.module_status_bits) != 0 print "LPM ON" if lpm_status else "LPM OFF" + +sx_api_close(handle) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmset.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmset.py index 9fafaa95140..132d3425755 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmset.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfplpmset.py @@ -1,23 +1,17 @@ #!/usr/bin/env python +""" +This utility set the power mode of a given module. +""" -import sys, errno -import os -from python_sdk_api.sxd_api import * +import sys +import errno from python_sdk_api.sx_api import * -REGISTER_NUM = 1 -SXD_LOG_VERBOSITY_LEVEL = 0 + DEVICE_ID = 1 SWITCH_ID = 0 SX_PORT_ATTR_ARR_SIZE = 64 -PMAOS_ASE = 1 -PMAOS_EE = 1 -PMAOS_E = 2 -PMAOS_RST = 0 -PMAOS_ENABLE = 1 -PMAOS_DISABLE = 2 - PORT_TYPE_CPU = 4 PORT_TYPE_NVE = 8 PORT_TYPE_OFFSET = 28 @@ -36,7 +30,7 @@ def is_port_admin_status_up(log_port): admin_state_p = new_sx_port_admin_state_t_p() module_state_p = new_sx_port_module_state_t_p() rc = sx_api_port_state_get(handle, log_port, oper_state_p, admin_state_p, module_state_p) - assert rc == SXD_STATUS_SUCCESS, "sx_api_port_state_get failed, rc = %d" % rc + assert rc == SX_STATUS_SUCCESS, "sx_api_port_state_get failed, rc = %d" % rc admin_state = sx_port_admin_state_t_p_value(admin_state_p) if admin_state == SX_PORT_ADMIN_STATUS_UP: @@ -54,116 +48,109 @@ def get_log_ports(handle, sfp_module): port_cnt_p = new_uint32_t_p() uint32_t_p_assign(port_cnt_p, SX_PORT_ATTR_ARR_SIZE) - rc = sx_api_port_device_get(handle, DEVICE_ID , SWITCH_ID, port_attributes_list, port_cnt_p) + rc = sx_api_port_device_get(handle, DEVICE_ID, SWITCH_ID, port_attributes_list, port_cnt_p) assert rc == SX_STATUS_SUCCESS, "sx_api_port_device_get failed, rc = %d" % rc port_cnt = uint32_t_p_value(port_cnt_p) log_port_list = [] for i in range(0, port_cnt): port_attributes = sx_port_attributes_t_arr_getitem(port_attributes_list, i) - if is_nve(int(port_attributes.log_port)) == False \ - and is_cpu(int(port_attributes.log_port)) == False \ + if not is_nve(int(port_attributes.log_port)) \ + and not is_cpu(int(port_attributes.log_port)) \ and port_attributes.port_mapping.module_port == sfp_module \ and is_port_admin_status_up(port_attributes.log_port): log_port_list.append(port_attributes.log_port) return log_port_list -def init_sx_meta_data(): - meta = sxd_reg_meta_t() - meta.dev_id = DEVICE_ID - meta.swid = SWITCH_ID - return meta - -def set_sfp_admin_status(sfp_module, admin_status): - # Get PMAOS - pmaos = ku_pmaos_reg() - pmaos.module = sfp_module - meta = init_sx_meta_data() - meta.access_cmd = SXD_ACCESS_CMD_GET - rc = sxd_access_reg_pmaos(pmaos, meta, REGISTER_NUM, None, None) - assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc - - # Set admin status to PMAOS - pmaos.ase = PMAOS_ASE - pmaos.ee = PMAOS_EE - pmaos.e = PMAOS_E - pmaos.rst = PMAOS_RST - if admin_status == SX_PORT_ADMIN_STATUS_DOWN: - pmaos.admin_status = PMAOS_DISABLE +def mgmt_phy_mod_pwr_attr_set(handle, module_id, power_attr_type, admin_pwr_mode): + sx_mgmt_phy_mod_pwr_attr = sx_mgmt_phy_mod_pwr_attr_t() + sx_mgmt_phy_mod_pwr_mode_attr = sx_mgmt_phy_mod_pwr_mode_attr_t() + sx_mgmt_phy_mod_pwr_attr.power_attr_type = power_attr_type + sx_mgmt_phy_mod_pwr_mode_attr.admin_pwr_mode_e = admin_pwr_mode + sx_mgmt_phy_mod_pwr_attr.pwr_mode_attr = sx_mgmt_phy_mod_pwr_mode_attr + sx_mgmt_phy_mod_pwr_attr_p = new_sx_mgmt_phy_mod_pwr_attr_t_p() + sx_mgmt_phy_mod_pwr_attr_t_p_assign(sx_mgmt_phy_mod_pwr_attr_p, sx_mgmt_phy_mod_pwr_attr) + try: + rc = sx_mgmt_phy_mod_pwr_attr_set(handle, SX_ACCESS_CMD_SET, module_id, sx_mgmt_phy_mod_pwr_attr_p) + assert SX_STATUS_SUCCESS == rc, "sx_mgmt_phy_mod_pwr_attr_set failed" + finally: + delete_sx_mgmt_phy_mod_pwr_attr_t_p(sx_mgmt_phy_mod_pwr_attr_p) + +def mgmt_phy_mod_pwr_attr_get(handle, module_id, power_attr_type): + sx_mgmt_phy_mod_pwr_attr_p = new_sx_mgmt_phy_mod_pwr_attr_t_p() + sx_mgmt_phy_mod_pwr_attr = sx_mgmt_phy_mod_pwr_attr_t() + sx_mgmt_phy_mod_pwr_attr.power_attr_type = power_attr_type + sx_mgmt_phy_mod_pwr_attr_t_p_assign(sx_mgmt_phy_mod_pwr_attr_p, sx_mgmt_phy_mod_pwr_attr) + try: + rc = sx_mgmt_phy_mod_pwr_attr_get(handle, module_id, sx_mgmt_phy_mod_pwr_attr_p) + assert SX_STATUS_SUCCESS == rc, "sx_mgmt_phy_mod_pwr_attr_get failed" + sx_mgmt_phy_mod_pwr_attr = sx_mgmt_phy_mod_pwr_attr_t_p_value(sx_mgmt_phy_mod_pwr_attr_p) + pwr_mode_attr = sx_mgmt_phy_mod_pwr_attr.pwr_mode_attr + return pwr_mode_attr.admin_pwr_mode_e, pwr_mode_attr.oper_pwr_mode_e + finally: + delete_sx_mgmt_phy_mod_pwr_attr_t_p(sx_mgmt_phy_mod_pwr_attr_p) + + +def pwr_attr_set(handle, module_id, ports, attr_type, power_mode): + # Check if the module already works in the same mode + admin_pwr_mode, oper_pwr_mode = mgmt_phy_mod_pwr_attr_get(handle, module_id, attr_type) + if (power_mode == SX_MGMT_PHY_MOD_PWR_MODE_LOW_E and oper_pwr_mode == SX_MGMT_PHY_MOD_PWR_MODE_LOW_E) \ + or (power_mode == SX_MGMT_PHY_MOD_PWR_MODE_AUTO_E and admin_pwr_mode == SX_MGMT_PHY_MOD_PWR_MODE_AUTO_E): + return + try: + # Bring the port down + for port in ports: + set_port_admin_status_by_log_port(handle, port, SX_PORT_ADMIN_STATUS_DOWN) + # Set the desired power mode + mgmt_phy_mod_pwr_attr_set(handle, module_id, attr_type, power_mode) + # Bring the port up + finally: + for port in ports: + set_port_admin_status_by_log_port(handle, port, SX_PORT_ADMIN_STATUS_UP) + +def set_lpmode(handle, cmd, module_id): + # Construct the port module map. + log_port_list = get_log_ports(handle, module_id) + + if cmd == "enable": + pwr_attr_set(handle, module_id, log_port_list, SX_MGMT_PHY_MOD_PWR_ATTR_PWR_MODE_E, SX_MGMT_PHY_MOD_PWR_MODE_LOW_E) + print("Enabled low power mode for module [%d]" % module_id) + elif cmd == "disable": + pwr_attr_set(handle, module_id, log_port_list, SX_MGMT_PHY_MOD_PWR_ATTR_PWR_MODE_E, SX_MGMT_PHY_MOD_PWR_MODE_AUTO_E) + print("Disabled low power mode for module [%d]" % module_id) else: - pmaos.admin_status = PMAOS_ENABLE - - meta.access_cmd = SXD_ACCESS_CMD_SET - rc = sxd_access_reg_pmaos(pmaos, meta, REGISTER_NUM, None, None) - assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc - -def set_sfp_lpmode(sfp_module, lpm_enable): - # Get PMMP - pmmp = ku_pmmp_reg() - pmmp.module = sfp_module - meta = init_sx_meta_data() - meta.access_cmd = SXD_ACCESS_CMD_GET - rc = sxd_access_reg_pmmp(pmmp, meta, REGISTER_NUM, None, None) - assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmmp failed, rc = %d" % rc - - # Set low power mode status - lpm_mask = 1 << 8 - if lpm_enable: - pmmp.eeprom_override = pmmp.eeprom_override | lpm_mask - else: - pmmp.eeprom_override = pmmp.eeprom_override & (~lpm_mask) - - meta.access_cmd = SXD_ACCESS_CMD_SET - rc = sxd_access_reg_pmmp(pmmp, meta, REGISTER_NUM, None, None) - assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmmp failed, rc = %d" % rc + print("Error: Invalid command") + sys.exit(0) -# Check if SFP port number is provided if len(sys.argv) < 3: - print "SFP module number or LPM is missed." - print "Usage: sfplpmset.py " + print("SFP module number or LPM is missed.") + print("Usage: sfplpmset.py ") sys.exit(errno.EINVAL) +cmd = None lpm_enable = None if sys.argv[2] == 'on': lpm_enable = True + cmd = 'enable' elif sys.argv[2] == 'off': lpm_enable = False + cmd = 'disable' else: - print "Unrecognized LPM parameter. Please use or values" + print("Unrecognized LPM parameter. Please use or values") sys.exit(errno.EINVAL) -# Init SDK API -rc, handle = sx_api_open(None) -if (rc != SX_STATUS_SUCCESS): - print "Failed to open api handle.\nPlease check that SDK is running." - sys.exit(errno.EACCES) - -pid = os.getpid() -rc = sxd_access_reg_init(pid, None, SXD_LOG_VERBOSITY_LEVEL) -if (rc != SXD_STATUS_SUCCESS): - print "Failed to initializing register access.\nPlease check that SDK is running." - sys.exit(errno.EACCES); - # Get SFP module sfp_module = int(sys.argv[1]) - 1 -# Get all ports at admin up status that related to the SFP module -log_port_list = get_log_ports(handle, sfp_module) - -# SET SFP related ports to admin down status -for log_port in log_port_list: - set_port_admin_status_by_log_port(handle, log_port, SX_PORT_ADMIN_STATUS_DOWN) - -# Disable admin status before LPM settings -set_sfp_admin_status(sfp_module, SX_PORT_ADMIN_STATUS_DOWN) +print "[+] opening sdk" +rc, handle = sx_api_open(None) -# Set low power mode status -set_sfp_lpmode(sfp_module, lpm_enable) +if (rc != SX_STATUS_SUCCESS): + print("Failed to open api handle.\nPlease check that SDK is running.") + sys.exit(errno.EACCES) -# Enable admin status after LPM settings -set_sfp_admin_status(sfp_module, SX_PORT_ADMIN_STATUS_UP) +# Set low power mode +set_lpmode(handle, cmd, sfp_module) -# SET SFP related ports to admin up status -for log_port in log_port_list: - set_port_admin_status_by_log_port(handle, log_port, SX_PORT_ADMIN_STATUS_UP) +sx_api_close(handle) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfpreset.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfpreset.py index 2ba6c6d7bc7..2e6de2e8bc8 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfpreset.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfpreset.py @@ -1,45 +1,28 @@ -#!/usr/bin/env python - -import sys, errno -import os -from python_sdk_api.sxd_api import * -from python_sdk_api.sx_api import * - -# Check if SFP port number is provided -if len(sys.argv) < 2: - print "SFP module number or LPM is missed." - print "Usage: sfpreset.py " - sys.exit(errno.EINVAL) - -# Init SDK API -rc, handle = sx_api_open(None) -if (rc != SX_STATUS_SUCCESS): - print "Failed to open api handle.\nPlease check that SDK is running." - sys.exit(errno.EACCES) - -pid = os.getpid() -rc = sxd_access_reg_init(pid, None, 0) -if (rc != 0): - print "Failed to initializing register access.\nPlease check that SDK is running." - sys.exit(errno.EACCES) - -# Get SFP module number -sfp_module = int(sys.argv[1]) - 1 - -# Get PMAOS -pmaos = ku_pmaos_reg() -pmaos.module = sfp_module -meta = sxd_reg_meta_t() -meta.dev_id = 1 -meta.swid = 0 -meta.access_cmd = SXD_ACCESS_CMD_GET - -rc = sxd_access_reg_pmaos(pmaos, meta, 1, None, None) -assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc - -# Reset SFP -pmaos.rst = 1 -meta.access_cmd = SXD_ACCESS_CMD_SET -rc = sxd_access_reg_pmaos(pmaos, meta, 1, None, None) -assert rc == SXD_STATUS_SUCCESS, "sxd_access_reg_pmaos failed, rc = %d" % rc -print "Reset flag is set" +#!/usr/bin/env python +""" +This utility reset the given SFP module. +""" + +import sys +import errno +from python_sdk_api.sx_api import * + +# Check if SFP port number is provided +if len(sys.argv) < 2: + print("SFP module number or LPM is missed.") + print("Usage: sfpreset.py ") + sys.exit(errno.EINVAL) + +# Init SDK API +rc, handle = sx_api_open(None) +if rc != SX_STATUS_SUCCESS: + print("Failed to open api handle.\nPlease check that SDK is running.") + sys.exit(errno.EACCES) + +# Get SFP module number +sfp_module = int(sys.argv[1]) - 1 + +rc = sx_mgmt_phy_mod_reset(handle, sfp_module) +assert rc == SX_STATUS_SUCCESS, "sx_mgmt_phy_mod_reset failed, rc = %d" % rc + +sx_api_close(handle) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py index 71d8945afda..7c9f2c2a952 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py @@ -320,14 +320,14 @@ def get_transceiver_info_dict(self, port_num): return None transceiver_info_dict['type'] = sfp_type_data['data']['type']['value'] - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data['data']['Vendor Name']['value'] - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] # Below part is added to avoid fail the xcvrd, shall be implemented later transceiver_info_dict['vendor_oui'] = 'N/A' transceiver_info_dict['vendor_date'] = 'N/A' - transceiver_info_dict['Connector'] = 'N/A' + transceiver_info_dict['connector'] = 'N/A' transceiver_info_dict['encoding'] = 'N/A' transceiver_info_dict['ext_identifier'] = 'N/A' transceiver_info_dict['ext_rateselect_compliance'] = 'N/A' @@ -404,13 +404,13 @@ def get_transceiver_info_dict(self, port_num): return None transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] - transceiver_info_dict['manufacturename'] = sfp_vendor_name_data['data']['Vendor Name']['value'] - transceiver_info_dict['modelname'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] - transceiver_info_dict['hardwarerev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] - transceiver_info_dict['serialnum'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] - transceiver_info_dict['Connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json b/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json index d12b2100eea..86910af29e8 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/pmon_daemon_control.json @@ -1,5 +1,6 @@ { "skip_ledd": true, - "skip_fancontrol": true + "skip_fancontrol": true, + "delay_xcvrd": true } diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf index 247db54f99d..62f100d757e 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf @@ -1,95 +1,81 @@ -bus "i2c-7" "i2c-1-mux (chan_id 5)" -chip "lm75-i2c-7-4a" - label temp1 "Ambient Port Temp" +################################################################################ +# Copyright (c) 2020 Mellanox Technologies +# +# Platform specific sensors config for SN2700 +################################################################################ -bus "i2c-5" "i2c-1-mux (chan_id 3)" -chip "ucd9200-i2c-5-27" - label in1 "UCD1 vin" - label in2 "ASIC 3.3 vout" - label in3 "ASIC 1.2 vout" - label temp1 "UCD1 Temp" - label temp2 "UCD1 Temp2" +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 2)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" -chip "ucd9200-i2c-5-41" - label in1 "UCD2 vin" - label in2 "ASIC Vcore vout" - label temp1 "UCD2 Temp1" - label temp2 "UCD2 Temp2" +bus "i2c-7" "i2c-1-mux (chan_id 7)" + chip "lm75-i2c-7-4a" + label temp1 "Ambient Port Temp" -bus "i2c-17" "i2c-1-mux (chan_id 7)" -chip "lm75-i2c-17-49" - label temp1 "Ambient Board Temp" +bus "i2c-17" "i2c-1-mux (chan_id 17)" + chip "lm75-i2c-17-49" + label temp1 "Ambient Fan Temp" -chip "mlxsw-*" - ignore temp2 - ignore temp3 - ignore temp4 - ignore temp5 - ignore temp6 - ignore temp7 - ignore temp8 - ignore temp9 - ignore temp10 - ignore temp11 - ignore temp12 - ignore temp13 - ignore temp14 - ignore temp15 - ignore temp16 - ignore temp17 - ignore temp18 - ignore temp19 - ignore temp20 - ignore temp21 - ignore temp22 - ignore temp23 - ignore temp24 - ignore temp25 - ignore temp26 - ignore temp27 - ignore temp28 - ignore temp29 - ignore temp30 - ignore temp31 - ignore temp32 - ignore temp33 - ignore temp34 - ignore temp35 - ignore temp36 - ignore temp37 - ignore temp38 - ignore temp39 - ignore temp40 - ignore temp41 - ignore temp42 - ignore temp43 - ignore temp44 - ignore temp45 - ignore temp46 - ignore temp47 - ignore temp48 - ignore temp49 - ignore temp50 - ignore temp51 - ignore temp52 - ignore temp53 - ignore temp54 - ignore temp55 - ignore temp56 - ignore temp57 - ignore temp58 - ignore temp59 - ignore temp60 - ignore temp61 - ignore temp62 - ignore temp63 - ignore temp64 +chip "acpitz-virtual-0" + label temp1 "ACPI CPU Temp" + label temp2 "ACPI Board Temp" -chip "*-virtual-*" - ignore temp1 - ignore temp2 +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 5)" + chip "pmbus-i2c-5-41" + label in1 "PMB-1 PSU 12V Rail (in)" + label in2 "PMB-1 0.9V VCORE Rail (out)" + label temp1 "PMB-1 Temp 1" + label temp2 "PMB-1 Temp 2" + ignore power1 + label power2 "PMB-1 0.9V VCORE Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-1 0.9V VCORE Rail Curr (out)" + chip "pmbus-i2c-5-27" + label in1 "PMB-2 PSU 12V Rail (in)" + label in2 "PMB-2 3.3V Rail (out)" + label in3 "PMB-2 1.2V Rail (out)" + label temp1 "PMB-2 Temp 1" + label temp2 "PMB-2 Temp 2" + ignore power1 + label power2 "PMB-2 3.3V Rail Pwr (out)" + label power3 "PMB-2 1.2V Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-2 3.3V Rail Curr (out)" + label curr3 "PMB-2 1.2V Rail Curr (out)" -chip "dps460-*" - ignore fan2 - ignore fan3 +# Power supplies +bus "i2c-10" "i2c-1-mux (chan_id 10)" + chip "dps460-i2c-*-58" + label in1 "PSU-2(R) 220V Rail (in)" + label in2 "PSU-2(R) 12V Rail (out)" + label fan1 "PSU-2(R) Fan 1" + label temp1 "PSU-2(R) Temp 1" + label temp2 "PSU-2(R) Temp 2" + label power1 "PSU-2(R) 220V Rail Pwr (in)" + label power2 "PSU-2(R) 12V Rail Pwr (out)" + label curr1 "PSU-2(R) 220V Rail Curr (in)" + label curr2 "PSU-2(R) 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-1(L) 220V Rail (in)" + label in2 "PSU-1(L) 12V Rail (out)" + label fan1 "PSU-1(L) Fan 1" + label temp1 "PSU-1(L) Temp 1" + label temp2 "PSU-1(L) Temp 2" + label power1 "PSU-1(L) 220V Rail Pwr (in)" + label power2 "PSU-1(L) 12V Rail Pwr (out)" + label curr1 "PSU-1(L) 220V Rail Curr (in)" + label curr2 "PSU-1(L) 12V Rail Curr (out)" +# Chassis fans +bus "i2c-2" "i2c-1-mux (chan_id 2)" + chip "mlxsw-i2c-*-48" + label fan1 "Chassis Drawer-1 Fan-1" + label fan2 "Chassis Drawer-1 Fan-2" + label fan3 "Chassis Drawer-2 Fan-1" + label fan4 "Chassis Drawer-2 Fan-2" + label fan5 "Chassis Drawer-3 Fan-1" + label fan6 "Chassis Drawer-3 Fan-2" + label fan7 "Chassis Drawer-4 Fan-1" + label fan8 "Chassis Drawer-4 Fan-2" diff --git a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/pmon_daemon_control.json b/device/mellanox/x86_64-mlnx_msn2700_simx-r0/pmon_daemon_control.json index 40fc367acf3..4650f9a5eee 100644 --- a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/pmon_daemon_control.json +++ b/device/mellanox/x86_64-mlnx_msn2700_simx-r0/pmon_daemon_control.json @@ -1,5 +1,6 @@ { "skip_ledd": true, "skip_xcvrd": true, - "skip_psud": true + "skip_psud": true, + "skip_thermalctld": true } diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai_2740.xml b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai_2740.xml index 559f2bdd10c..7c8f880c636 100644 --- a/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai_2740.xml +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai_2740.xml @@ -18,7 +18,7 @@ 3 - + 98368 diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn2740-r0/platform_components.json index 7964d9cb871..da85f2b5792 100644 --- a/device/mellanox/x86_64-mlnx_msn2740-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/platform_components.json @@ -1,9 +1,12 @@ { "chassis": { - "x86_64-mlnx_msn2740-r0": { + "MSN2740": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2740-r0/sensors.conf deleted file mode 120000 index ea04d66d008..00000000000 --- a/device/mellanox/x86_64-mlnx_msn2740-r0/sensors.conf +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700-r0/sensors.conf \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2740-r0/sensors.conf new file mode 100644 index 00000000000..ffc36fe2168 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/sensors.conf @@ -0,0 +1,76 @@ +################################################################################ +# Copyright (c) 2020 Mellanox Technologies +# +# Platform specific sensors config for SN2740 +################################################################################ + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-48" + label temp1 "Ambient Port Temp" + +bus "i2c-6" "i2c-1-mux (chan_id 5)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "pmbus-i2c-*-41" + label in1 "PMB-1 PSU 12V Rail (in)" + label in2 "PMB-1 0.9V VCORE Rail (out)" + label in3 "PMB-1 1.8V VCORE Rail (out)" + label temp1 "PMB-1 Temp 1" + label temp2 "PMB-1 Temp 2" + ignore power1 + label power2 "PMB-1 0.9V VCORE Rail Pwr (out)" + label power3 "PMB-1 1.8V Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-1 0.9V VCORE Rail Curr (out)" + label curr3 "PMB-1 1.8V Rail Curr (out)" + chip "pmbus-i2c-*-27" + label in1 "PMB-2 PSU 12V Rail (in)" + label in2 "PMB-2 3.3V Rail (out)" + label in3 "PMB-2 1.2V Rail (out)" + label temp1 "PMB-2 Temp 1" + label temp2 "PMB-2 Temp 2" + ignore power1 + label power2 "PMB-2 3.3V Rail Pwr (out)" + label power3 "PMB-2 1.2V Rail Pwr (out)" + ignore curr1 + label curr2 "PMB-2 3.3V Rail Curr (out)" + label curr3 "PMB-2 1.2V Rail Curr (out)" + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-2(R) 220V Rail (in)" + label in2 "PSU-2(R) 12V Rail (out)" + label fan1 "PSU-2(R) Fan 1" + label temp1 "PSU-2(R) Temp 1" + label temp2 "PSU-2(R) Temp 2" + label power1 "PSU-2(R) 220V Rail Pwr (in)" + label power2 "PSU-2(R) 12V Rail Pwr (out)" + label curr1 "PSU-2(R) 220V Rail Curr (in)" + label curr2 "PSU-2(R) 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-1(L) 220V Rail (in)" + label in2 "PSU-1(L) 12V Rail (out)" + label fan1 "PSU-1(L) Fan 1" + label temp1 "PSU-1(L) Temp 1" + label temp2 "PSU-1(L) Temp 2" + label power1 "PSU-1(L) 220V Rail Pwr (in)" + label power2 "PSU-1(L) 12V Rail Pwr (out)" + label curr1 "PSU-1(L) 220V Rail Curr (in)" + label curr2 "PSU-1(L) 12V Rail Curr (out)" + +# Chassis fans +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label fan1 "Chassis Fan Drawer-1" + label fan2 "Chassis Fan Drawer-2" + label fan3 "Chassis Fan Drawer-3" + label fan4 "Chassis Fan Drawer-4" diff --git a/device/mellanox/x86_64-mlnx_msn3420-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn3420-r0/platform_components.json index f3ea5918a09..9b5cceae9fc 100644 --- a/device/mellanox/x86_64-mlnx_msn3420-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn3420-r0/platform_components.json @@ -1,7 +1,9 @@ { "chassis": { - "x86_64-mlnx_msn3420-r0": { + "MSN3420": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, "CPLD1": { }, "CPLD2": { }, diff --git a/device/mellanox/x86_64-mlnx_msn3420-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn3420-r0/sensors.conf index 5718ff99518..b0e4901eccc 100644 --- a/device/mellanox/x86_64-mlnx_msn3420-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn3420-r0/sensors.conf @@ -21,33 +21,41 @@ bus "i2c-15" "i2c-1-mux (chan_id 6)" # Power controllers bus "i2c-5" "i2c-1-mux (chan_id 4)" - chip "tps53679-i2c-*-70" - label in1 "PMIC-1 PSU 12V Rail (in)" - label in2 "PMIC-1 PSU 12V Rail (in)" - label in3 "PMIC-1 COMEX 1.8V Rail (out)" - label in4 "PMIC-1 COMEX 1.05V Rail (out)" + chip "xdpe12284-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in1)" + label in2 "PMIC-1 PSU 12V Rail (in2)" + label in3 "PMIC-1 VCORE 0.8V Rail (out)" + label in4 "PMIC-1 COMEX 1.2V Rail (out)" label temp1 "PMIC-1 Temp 1" label temp2 "PMIC-1 Temp 2" - label power1 "PMIC-1 COMEX 1.8V Rail Pwr (out)" - label power2 "PMIC-1 COMEX 1.05V Rail Pwr (out)" - label curr1 "PMIC-1 COMEX 1.8V Rail Curr (out)" - label curr2 "PMIC-1 COMEX 1.05V Rail Curr (out)" - chip "tps53679-i2c-*-71" - label in1 "PMIC-2 PSU 12V Rail (in)" - label in2 "PMIC-2 PSU 12V Rail (in)" - label in3 "PMIC-2 COMEX 1.8V Rail (out)" - label in4 "PMIC-2 COMEX 1.05V Rail (out)" + label power1 "PMIC-1 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-1 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-1 VCORE 0.8V Rail Pwr (out)" + label power4 "PMIC-1 COMEX 1.2V Rail Pwr (out)" + label curr1 "PMIC-1 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-1 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-1 VCORE 0.8V Rail Curr (out)" + label curr4 "PMIC-1 COMEX 1.2V Rail Curr (out)" + chip "xdpe12284-i2c-*-64" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 PSU 12V Rail (in2)" + label in3 "PMIC-2 1.8V Rail (out)" + ignore in4 label temp1 "PMIC-2 Temp 1" - label temp2 "PMIC-2 Temp 2" - label power1 "PMIC-2 COMEX 1.8V Rail Pwr (out)" - label power2 "PMIC-2 COMEX 1.05V Rail Pwr (out)" - label curr1 "PMIC-2 COMEX 1.8V Rail Curr (out)" - label curr2 "PMIC-2 COMEX 1.05V Rail Curr (out)" + ignore temp2 + label power1 "PMIC-2 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-2 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-2 1.8V Rail Pwr (out)" + ignore power4 + label curr1 "PMIC-2 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-2 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-2 1.8V Rail Curr (out)" + ignore curr4 bus "i2c-15" "i2c-1-mux (chan_id 6)" chip "tps53679-i2c-*-58" - label in1 "PMIC-3 PSU 12V Rail (in)" - label in2 "PMIC-3 PSU 12V Rail (in)" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 PSU 12V Rail (in2)" label in3 "PMIC-3 COMEX 1.8V Rail (out)" label in4 "PMIC-3 COMEX 1.05V Rail (out)" label temp1 "PMIC-3 Temp 1" @@ -57,31 +65,20 @@ bus "i2c-15" "i2c-1-mux (chan_id 6)" label curr1 "PMIC-3 COMEX 1.8V Rail Curr (out)" label curr2 "PMIC-3 COMEX 1.05V Rail Curr (out)" chip "tps53679-i2c-*-61" - label in1 "PMIC-4 PSU 12V Rail (in)" - label in2 "PMIC-4 PSU 12V Rail (in)" - label in3 "PMIC-4 COMEX 1.8V Rail (out)" - label in4 "PMIC-4 COMEX 1.05V Rail (out)" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 PSU 12V Rail (in2)" + label in3 "PMIC-4 COMEX 1.2V Rail (out)" + ignore in4 label temp1 "PMIC-4 Temp 1" label temp2 "PMIC-4 Temp 2" - label power1 "PMIC-4 COMEX 1.8V Rail Pwr (out)" - label power2 "PMIC-4 COMEX 1.05V Rail Pwr (out)" - label curr1 "PMIC-4 COMEX 1.8V Rail Curr (out)" - label curr2 "PMIC-4 COMEX 1.05V Rail Curr (out)" + label power1 "PMIC-4 COMEX 1.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-4 COMEX 1.2V Rail Curr (out)" + ignore curr2 # Power supplies bus "i2c-4" "i2c-1-mux (chan_id 3)" chip "dps460-i2c-*-58" - label in1 "PSU-1 220V Rail (in)" - label in2 "PSU-1 12V Rail (out)" - label fan1 "PSU-1 Fan 1" - label temp1 "PSU-1 Temp 1" - label temp2 "PSU-1 Temp 2" - label temp3 "PSU-1 Temp 3" - label power1 "PSU-1 220V Rail Pwr (in)" - label power2 "PSU-1 12V Rail Pwr (out)" - label curr1 "PSU-1 220V Rail Curr (in)" - label curr2 "PSU-1 12V Rail Curr (out)" - chip "dps460-i2c-*-59" label in1 "PSU-2 220V Rail (in)" label in2 "PSU-2 12V Rail (out)" label fan1 "PSU-2 Fan 1" @@ -92,6 +89,17 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2 12V Rail Pwr (out)" label curr1 "PSU-2 220V Rail Curr (in)" label curr2 "PSU-2 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-1 220V Rail (in)" + label in2 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t0.j2 index e26ad28b9f0..959cc8359be 100644 --- a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t0.j2 +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t0.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '14983147' %} -{% set ingress_lossy_pool_size = '14983147' %} -{% set egress_lossless_pool_size = '34340822' %} -{% set egress_lossy_pool_size = '14983147' %} +{% set ingress_lossless_pool_size = '14542848' %} +{% set ingress_lossy_pool_size = '14542848' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '14542848' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t1.j2 index b5e4ff8d174..cef78f34b4f 100644 --- a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t1.j2 +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/buffers_defaults_t1.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '9158635' %} -{% set ingress_lossy_pool_size = '9158635' %} -{% set egress_lossless_pool_size = '34340822' %} -{% set egress_lossy_pool_size = '9158635' %} +{% set ingress_lossless_pool_size = '11622400' %} +{% set ingress_lossy_pool_size = '11622400' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '11622400' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/pg_profile_lookup.ini index 6cd06326cf3..2e420e15871 100644 --- a/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/ACS-MSN3700/pg_profile_lookup.ini @@ -1,22 +1,20 @@ -# speed cable size xon xoff threshold - 1000 5m 35840 18432 17408 0 - 10000 5m 36864 18432 18432 0 - 25000 5m 36864 18432 18432 0 - 40000 5m 36864 18432 18432 0 - 50000 5m 37888 18432 19456 0 - 100000 5m 38912 18432 20480 0 - 200000 5m 41984 18432 23552 0 - 1000 40m 36864 18432 18432 0 - 10000 40m 38912 18432 20480 0 - 25000 40m 41984 18432 23552 0 - 40000 40m 45056 18432 26624 0 - 50000 40m 47104 18432 28672 0 - 100000 40m 59392 18432 40960 0 - 200000 40m 81920 18432 63488 0 - 1000 300m 37888 18432 19456 0 - 10000 300m 53248 18432 34816 0 - 25000 300m 78848 18432 60416 0 - 40000 300m 104448 18432 86016 0 - 50000 300m 121856 18432 103424 0 - 100000 300m 206848 18432 188416 0 - 200000 300m 376832 18432 358400 0 +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 52224 19456 32768 0 + 25000 5m 52224 19456 32768 0 + 40000 5m 53248 19456 33792 0 + 50000 5m 53248 19456 33792 0 + 100000 5m 53248 19456 33792 0 + 200000 5m 55296 19456 35840 0 + 10000 40m 53248 19456 33792 0 + 25000 40m 55296 19456 35840 0 + 40000 40m 57344 19456 37888 0 + 50000 40m 58368 19456 38912 0 + 100000 40m 63488 19456 44032 0 + 200000 40m 74752 19456 55296 0 + 10000 300m 60416 19456 40960 0 + 25000 300m 73728 19456 54272 0 + 40000 300m 86016 19456 66560 0 + 50000 300m 95232 19456 75776 0 + 100000 300m 137216 19456 117760 0 + 200000 300m 223232 19456 203776 0 diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn3700-r0/platform_components.json index 7c0b7598aff..6ca284d3f34 100644 --- a/device/mellanox/x86_64-mlnx_msn3700-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/platform_components.json @@ -1,9 +1,13 @@ { "chassis": { - "x86_64-mlnx_msn3700-r0": { + "MSN3700": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { }, + "CPLD3": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf index 28a889aa27d..281f0a54dfa 100644 --- a/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn3700-r0/sensors.conf @@ -72,20 +72,6 @@ bus "i2c-15" "i2c-1-mux (chan_id 6)" # Power supplies bus "i2c-4" "i2c-1-mux (chan_id 3)" chip "dps460-i2c-*-58" - label in1 "PSU-1 220V Rail (in)" - ignore in2 - label in3 "PSU-1 12V Rail (out)" - label fan1 "PSU-1 Fan 1" - ignore fan2 - ignore fan3 - label temp1 "PSU-1 Temp 1" - label temp2 "PSU-1 Temp 2" - label temp3 "PSU-1 Temp 3" - label power1 "PSU-1 220V Rail Pwr (in)" - label power2 "PSU-1 12V Rail Pwr (out)" - label curr1 "PSU-1 220V Rail Curr (in)" - label curr2 "PSU-1 12V Rail Curr (out)" - chip "dps460-i2c-*-59" label in1 "PSU-2 220V Rail (in)" ignore in2 label in3 "PSU-2 12V Rail (out)" @@ -99,6 +85,20 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2 12V Rail Pwr (out)" label curr1 "PSU-2 220V Rail Curr (in)" label curr2 "PSU-2 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-1 220V Rail (in)" + ignore in2 + label in3 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/pmon_daemon_control.json b/device/mellanox/x86_64-mlnx_msn3700_simx-r0/pmon_daemon_control.json index 40fc367acf3..4650f9a5eee 100644 --- a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/pmon_daemon_control.json +++ b/device/mellanox/x86_64-mlnx_msn3700_simx-r0/pmon_daemon_control.json @@ -1,5 +1,6 @@ { "skip_ledd": true, "skip_xcvrd": true, - "skip_psud": true + "skip_psud": true, + "skip_thermalctld": true } diff --git a/device/mellanox/x86_64-mlnx_msn3700c-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn3700c-r0/platform_components.json index c55b9feab7c..807503fced4 100644 --- a/device/mellanox/x86_64-mlnx_msn3700c-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn3700c-r0/platform_components.json @@ -1,9 +1,13 @@ { "chassis": { - "x86_64-mlnx_msn3700c-r0": { + "MSN3700C": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { }, + "CPLD3": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf index 3c58e27f3e6..094cd78cde5 100644 --- a/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn3700c-r0/sensors.conf @@ -72,20 +72,6 @@ bus "i2c-15" "i2c-1-mux (chan_id 6)" # Power supplies bus "i2c-4" "i2c-1-mux (chan_id 3)" chip "dps460-i2c-*-58" - label in1 "PSU-1 220V Rail (in)" - ignore in2 - label in3 "PSU-1 12V Rail (out)" - label fan1 "PSU-1 Fan 1" - ignore fan2 - ignore fan3 - label temp1 "PSU-1 Temp 1" - label temp2 "PSU-1 Temp 2" - label temp3 "PSU-1 Temp 3" - label power1 "PSU-1 220V Rail Pwr (in)" - label power2 "PSU-1 12V Rail Pwr (out)" - label curr1 "PSU-1 220V Rail Curr (in)" - label curr2 "PSU-1 12V Rail Curr (out)" - chip "dps460-i2c-*-59" label in1 "PSU-2 220V Rail (in)" ignore in2 label in3 "PSU-2 12V Rail (out)" @@ -99,6 +85,20 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2 12V Rail Pwr (out)" label curr1 "PSU-2 220V Rail Curr (in)" label curr2 "PSU-2 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-1 220V Rail (in)" + ignore in2 + label in3 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t0.j2 index d69a0cc1383..bd8e1c8bb79 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t0.j2 +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t0.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '28196784' %} -{% set ingress_lossy_pool_size = '28196784' %} -{% set egress_lossless_pool_size = '34340832' %} -{% set egress_lossy_pool_size = '28196784' %} +{% set ingress_lossless_pool_size = '13924352' %} +{% set ingress_lossy_pool_size = '13924352' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '13924352' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t1.j2 index 78d43455a42..6e7b6b35918 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t1.j2 +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/buffers_defaults_t1.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '17891280' %} -{% set ingress_lossy_pool_size = '17891280' %} -{% set egress_lossless_pool_size = '34340832' %} -{% set egress_lossy_pool_size = '17891280' %} +{% set ingress_lossless_pool_size = '12457984' %} +{% set ingress_lossy_pool_size = '12457984' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '12457984' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/pg_profile_lookup.ini index 7c28e4c0d50..320daa45d29 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/ACS-MSN3800/pg_profile_lookup.ini @@ -1,23 +1,17 @@ -# PG lossless profiles. -# speed cable size xon xoff threshold - 1000 5m 32768 18432 14336 0 - 10000 5m 34816 18432 16384 0 - 25000 5m 38912 18432 20480 0 - 40000 5m 41984 18432 23552 0 - 50000 5m 44032 18432 25600 0 - 100000 5m 55296 18432 36864 0 - 200000 5m 77824 18432 59392 0 - 1000 40m 33792 18432 15360 0 - 10000 40m 36864 18432 18432 0 - 25000 40m 43008 18432 24576 0 - 40000 40m 49152 18432 30720 0 - 50000 40m 53248 18432 34816 0 - 100000 40m 72704 18432 54272 0 - 200000 40m 112640 18432 94208 0 - 1000 300m 34816 18432 16384 0 - 10000 300m 50176 18432 31744 0 - 25000 300m 75776 18432 57344 0 - 40000 300m 101376 18432 82944 0 - 50000 300m 117760 18432 99328 0 - 100000 300m 202752 18432 184320 0 - 200000 300m 373760 18432 355328 0 +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 54272 19456 34816 0 + 25000 5m 58368 19456 38912 0 + 40000 5m 61440 19456 41984 0 + 50000 5m 64512 19456 45056 0 + 100000 5m 75776 19456 56320 0 + 10000 40m 55296 19456 35840 0 + 25000 40m 60416 19456 40960 0 + 40000 40m 65536 19456 46080 0 + 50000 40m 69632 19456 50176 0 + 100000 40m 86016 19456 66560 0 + 10000 300m 63488 19456 44032 0 + 25000 300m 78848 19456 59392 0 + 40000 300m 95232 19456 75776 0 + 50000 300m 106496 19456 87040 0 + 100000 300m 159744 19456 140288 0 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64 deleted file mode 120000 index 65b8f3c8ec9..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64 +++ /dev/null @@ -1 +0,0 @@ -ACS-MSN3800/ \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers.json.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers.json.j2 new file mode 120000 index 00000000000..add8bf8bb7c --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers.json.j2 @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..62ecb68a948 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers_defaults_t0.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '25866240' %} +{% set ingress_lossless_pool_xoff = '2523136' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '25866240' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..e5d25be97e3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/buffers_defaults_t1.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '24219648' %} +{% set ingress_lossless_pool_xoff = '4169728' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '24219648' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/pg_profile_lookup.ini new file mode 120000 index 00000000000..ccbbfa44cd9 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/pg_profile_lookup.ini @@ -0,0 +1 @@ +../Mellanox-SN3800-D112C8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/port_config.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/port_config.ini new file mode 120000 index 00000000000..3302c4ce12d --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/port_config.ini @@ -0,0 +1 @@ +../ACS-MSN3800/port_config.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/qos.json.j2 new file mode 120000 index 00000000000..eccf286dc87 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/qos.json.j2 @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai.profile new file mode 100644 index 00000000000..4ea8c489781 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800.xml +SAI_VXLAN_SRCPORT_RANGE_ENABLE=1 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai_3800.xml b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai_3800.xml new file mode 120000 index 00000000000..686d6298865 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-C64/sai_3800.xml @@ -0,0 +1 @@ +../ACS-MSN3800/sai_3800.xml \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers.json.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers.json.j2 new file mode 120000 index 00000000000..add8bf8bb7c --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers.json.j2 @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/buffers.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..569d8f116b3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers_defaults_t0.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '20664320' %} +{% set ingress_lossless_pool_xoff = '3321856' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '20664320' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..8b61c177217 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/buffers_defaults_t1.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '19601408' %} +{% set ingress_lossless_pool_xoff = '4384768' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '19601408' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/pg_profile_lookup.ini new file mode 120000 index 00000000000..ccbbfa44cd9 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/pg_profile_lookup.ini @@ -0,0 +1 @@ +../Mellanox-SN3800-D112C8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/port_config.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/port_config.ini new file mode 100644 index 00000000000..535556ebfb3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/port_config.ini @@ -0,0 +1,115 @@ +# name lanes alias index speed +Ethernet0 0,1 etp1a 1 50000 +Ethernet2 2,3 etp1b 1 50000 +Ethernet4 4,5 etp2a 2 50000 +Ethernet6 6,7 etp2b 2 50000 +Ethernet8 8,9 etp3a 3 50000 +Ethernet10 10,11 etp3b 3 50000 +Ethernet12 12,13 etp4a 4 50000 +Ethernet14 14,15 etp4b 4 50000 +Ethernet16 16,17 etp5a 5 50000 +Ethernet18 18,19 etp5b 5 50000 +Ethernet20 20,21 etp6a 6 50000 +Ethernet22 22,23 etp6b 6 50000 +Ethernet24 24,25 etp7a 7 50000 +Ethernet26 26,27 etp7b 7 50000 +Ethernet28 28,29 etp8a 8 50000 +Ethernet30 30,31 etp8b 8 50000 +Ethernet32 32,33 etp9a 9 50000 +Ethernet34 34,35 etp9b 9 50000 +Ethernet36 36,37 etp10a 10 50000 +Ethernet38 38,39 etp10b 10 50000 +Ethernet40 40,41 etp11a 11 50000 +Ethernet42 42,43 etp11b 11 50000 +Ethernet44 44,45 etp12a 12 50000 +Ethernet46 46,47 etp12b 12 50000 +Ethernet48 48,49 etp13a 13 50000 +Ethernet50 50,51 etp13b 13 50000 +Ethernet52 52,53 etp14a 14 50000 +Ethernet54 54,55 etp14b 14 50000 +Ethernet56 56,57 etp15a 15 50000 +Ethernet58 58,59 etp15b 15 50000 +Ethernet60 60,61 etp16a 16 50000 +Ethernet62 62,63 etp16b 16 50000 +Ethernet64 64,65 etp17a 17 50000 +Ethernet66 66,67 etp17b 17 50000 +Ethernet68 68,69 etp18a 18 50000 +Ethernet70 70,71 etp18b 18 50000 +Ethernet72 72,73 etp19a 19 50000 +Ethernet74 74,75 etp19b 19 50000 +Ethernet76 76,77 etp20a 20 50000 +Ethernet78 78,79 etp20b 20 50000 +Ethernet80 80,81 etp21a 21 50000 +Ethernet82 82,83 etp21b 21 50000 +Ethernet84 84,85 etp22a 22 50000 +Ethernet86 86,87 etp22b 22 50000 +Ethernet88 88,89 etp23a 23 50000 +Ethernet90 90,91 etp23b 23 50000 +Ethernet92 92,93 etp24a 24 50000 +Ethernet94 94,95 etp24b 24 50000 +Ethernet96 96,97 etp25a 25 50000 +Ethernet98 98,99 etp25b 25 50000 +Ethernet100 100,101 etp26a 26 50000 +Ethernet102 102,103 etp26b 26 50000 +Ethernet104 104,105 etp27a 27 50000 +Ethernet106 106,107 etp27b 27 50000 +Ethernet108 108,109 etp28a 28 50000 +Ethernet110 110,111 etp28b 28 50000 +Ethernet112 112,113 etp29a 29 50000 +Ethernet114 114,115 etp29b 29 50000 +Ethernet116 116,117 etp30a 30 50000 +Ethernet118 118,119 etp30b 30 50000 +Ethernet120 120,121 etp31a 31 50000 +Ethernet122 122,123 etp31b 31 50000 +Ethernet124 124,125 etp32a 32 50000 +Ethernet126 126,127 etp32b 32 50000 +Ethernet128 128,129 etp33a 33 50000 +Ethernet130 130,131 etp33b 33 50000 +Ethernet132 132,133 etp34a 34 50000 +Ethernet134 134,135 etp34b 34 50000 +Ethernet136 136,137 etp35a 35 50000 +Ethernet138 138,139 etp35b 35 50000 +Ethernet140 140,141 etp36a 36 50000 +Ethernet142 142,143 etp36b 36 50000 +Ethernet144 144,145 etp37a 37 50000 +Ethernet146 146,147 etp37b 37 50000 +Ethernet148 148,149,150,151 etp38 38 10000 +Ethernet152 152,153 etp39a 39 50000 +Ethernet154 154,155 etp39b 39 50000 +Ethernet156 156,157,158,159 etp40 40 10000 +Ethernet160 160,161 etp41a 41 50000 +Ethernet162 162,163 etp41b 41 50000 +Ethernet164 164,165 etp42a 42 50000 +Ethernet166 166,167 etp42b 42 50000 +Ethernet168 168,169 etp43a 43 50000 +Ethernet170 170,171 etp43b 43 50000 +Ethernet172 172,173 etp44a 44 50000 +Ethernet174 174,175 etp44b 44 50000 +Ethernet176 176,177 etp45a 45 50000 +Ethernet178 178,179 etp45b 45 50000 +Ethernet180 180,181 etp46a 46 50000 +Ethernet182 182,183 etp46b 46 50000 +Ethernet184 184,185 etp47a 47 50000 +Ethernet186 186,187 etp47b 47 50000 +Ethernet188 188,189 etp48a 48 50000 +Ethernet190 190,191 etp48b 48 50000 +Ethernet192 192,193 etp49a 49 50000 +Ethernet194 194,195 etp49b 49 50000 +Ethernet196 196,197 etp50a 50 50000 +Ethernet198 198,199 etp50b 50 50000 +Ethernet200 200,201 etp51a 51 50000 +Ethernet202 202,203 etp51b 51 50000 +Ethernet204 204,205 etp52a 52 50000 +Ethernet206 206,207 etp52b 52 50000 +Ethernet208 208,209,210,211 etp53 53 100000 +Ethernet212 212,213,214,215 etp54 54 100000 +Ethernet216 216,217,218,219 etp55 55 100000 +Ethernet220 220,221,222,223 etp56 56 100000 +Ethernet224 224,225,226,227 etp57 57 100000 +Ethernet228 228,229,230,231 etp58 58 100000 +Ethernet232 232,233,234,235 etp59 59 100000 +Ethernet236 236,237,238,239 etp60 60 100000 +Ethernet240 240,241,242,243 etp61 61 100000 +Ethernet244 244,245,246,247 etp62 62 100000 +Ethernet248 248,249,250,251 etp63 63 100000 +Ethernet252 252,253,254,255 etp64 64 100000 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/qos.json.j2 new file mode 120000 index 00000000000..eccf286dc87 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/qos.json.j2 @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai.profile new file mode 100644 index 00000000000..5543225b55f --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_2x10g_100x50g_12x100g.xml +SAI_VXLAN_SRCPORT_RANGE_ENABLE=1 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai_3800_2x10g_100x50g_12x100g.xml b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai_3800_2x10g_100x50g_12x100g.xml new file mode 100644 index 00000000000..bf0fa4ca690 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D100C12S2/sai_3800_2x10g_100x50g_12x100g.xml @@ -0,0 +1,521 @@ + + + + + + 00:02:03:04:05:00 + + + 1 + + + 64 + + + + + 1 + 4 + 48 + + + 3 + + + 384 + 2 + + + 3 + 4 + 49 + 1 + 384 + 2 + + + 5 + 4 + 50 + 3 + 384 + 2 + + + 7 + 4 + 51 + 1 + 384 + 2 + + + 9 + 4 + 52 + 3 + 384 + 2 + + + 11 + 4 + 53 + 1 + 384 + 2 + + + 13 + 4 + 54 + 3 + 384 + 2 + + + 15 + 4 + 55 + 1 + 384 + 2 + + + 17 + 4 + 56 + 3 + 384 + 2 + + + 19 + 4 + 57 + 1 + 384 + 2 + + + 21 + 4 + 58 + 3 + 384 + 2 + + + 23 + 4 + 59 + 1 + 384 + 2 + + + 25 + 4 + 60 + 3 + 384 + 2 + + + 27 + 4 + 61 + 1 + 384 + 2 + + + 29 + 4 + 62 + 3 + 384 + 2 + + + 31 + 4 + 63 + 1 + 384 + 2 + + + 33 + 4 + 12 + 3 + 384 + 2 + + + 35 + 4 + 13 + 1 + 384 + 2 + + + 37 + 4 + 14 + 3 + 384 + 2 + + + 39 + 4 + 15 + 1 + 384 + 2 + + + 41 + 4 + 8 + 3 + 384 + 2 + + + 43 + 4 + 9 + 1 + 384 + 2 + + + 45 + 4 + 10 + 3 + 384 + 2 + + + 47 + 4 + 11 + 1 + 384 + 2 + + + 49 + 4 + 4 + 3 + 384 + 2 + + + 51 + 4 + 5 + 1 + 384 + 2 + + + 53 + 4 + 6 + 3 + 384 + 2 + + + 55 + 4 + 7 + 1 + 384 + 2 + + + 57 + 4 + 0 + 3 + 384 + 2 + + + 59 + 4 + 1 + 1 + 384 + 2 + + + 61 + 4 + 2 + 3 + 384 + 2 + + + 63 + 4 + 3 + 1 + 384 + 2 + + + 65 + 4 + 44 + 3 + 384 + 2 + + + 67 + 4 + 45 + 1 + 384 + 2 + + + 69 + 4 + 46 + 3 + 384 + 2 + + + 71 + 4 + 47 + 1 + 384 + 2 + + + 73 + 4 + 40 + 3 + 384 + 2 + + + 75 + 4 + 41 + 1 + 16 + + + 77 + 4 + 42 + 3 + 384 + 2 + + + 79 + 4 + 43 + 1 + 16 + + + 81 + 4 + 36 + 3 + 384 + 2 + + + 83 + 4 + 37 + 1 + 384 + 2 + + + 85 + 4 + 38 + 3 + 384 + 2 + + + 87 + 4 + 39 + 1 + 384 + 2 + + + 89 + 4 + 32 + 3 + 384 + 2 + + + 91 + 4 + 33 + 1 + 384 + 2 + + + 93 + 4 + 34 + 3 + 384 + 2 + + + 95 + 4 + 35 + 1 + 384 + 2 + + + 97 + 4 + 16 + 3 + 384 + 2 + + + 99 + 4 + 17 + 1 + 384 + 2 + + + 101 + 4 + 18 + 3 + 384 + 2 + + + 103 + 4 + 19 + 1 + 384 + 2 + + + 105 + 4 + 20 + 3 + 1536 + + + 107 + 4 + 21 + 1 + 1536 + + + 109 + 4 + 22 + 3 + 1536 + + + 111 + 4 + 23 + 1 + 1536 + + + 113 + 4 + 24 + 3 + 1536 + + + 115 + 4 + 25 + 1 + 1536 + + + 117 + 4 + 26 + 3 + 1536 + + + 119 + 4 + 27 + 1 + 1536 + + + 121 + 4 + 28 + 3 + 1536 + + + 123 + 4 + 29 + 1 + 1536 + + + 125 + 4 + 30 + 3 + 1536 + + + 127 + 4 + 31 + 1 + 1536 + + + + + diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t0.j2 deleted file mode 120000 index 0987f672486..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t0.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN3800/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..46fe890fabd --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t0.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '20017152' %} +{% set ingress_lossless_pool_xoff = '3440640' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '20017152' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t1.j2 deleted file mode 120000 index 119460bfa55..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t1.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN3800/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..252e0a976ad --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/buffers_defaults_t1.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '19124224' %} +{% set ingress_lossless_pool_xoff = '4333568' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '19124224' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/pg_profile_lookup.ini deleted file mode 120000 index db2f74508aa..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/pg_profile_lookup.ini +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN3800/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/pg_profile_lookup.ini new file mode 100644 index 00000000000..fd98cbe468b --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/pg_profile_lookup.ini @@ -0,0 +1,22 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 19456 19456 25600 0 + 25000 5m 19456 19456 28672 0 + 40000 5m 19456 19456 30720 0 + 50000 5m 19456 19456 32768 0 + 100000 5m 19456 19456 40960 0 + 10000 40m 19456 19456 26624 0 + 25000 40m 19456 19456 30720 0 + 40000 40m 19456 19456 33792 0 + 50000 40m 19456 19456 36864 0 + 100000 40m 19456 19456 48128 0 + 10000 300m 19456 19456 31744 0 + 25000 300m 19456 19456 44032 0 + 40000 300m 19456 19456 55296 0 + 50000 300m 19456 19456 63488 0 + 100000 300m 19456 19456 102400 0 + 10000 2000m 19456 19456 33792 0 + 25000 2000m 19456 19456 65536 0 + 40000 2000m 19456 19456 97280 0 + 50000 2000m 19456 19456 118784 0 + 100000 2000m 19456 19456 225280 0 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile index c5bb0c90f3d..ab1e27c6aec 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D112C8/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_112x50g_8x100g.xml +SAI_VXLAN_SRCPORT_RANGE_ENABLE=1 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t0.j2 deleted file mode 120000 index 0987f672486..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t0.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN3800/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..afe323f7f7a --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t0.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '24576000' %} +{% set ingress_lossless_pool_xoff = '2756608' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '24576000' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t1.j2 deleted file mode 120000 index 119460bfa55..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t1.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN3800/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..9ad4e6553cb --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/buffers_defaults_t1.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '22597632' %} +{% set ingress_lossless_pool_xoff = '4734976' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '22597632' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/pg_profile_lookup.ini index db2f74508aa..ccbbfa44cd9 120000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D24C52/pg_profile_lookup.ini @@ -1 +1 @@ -../ACS-MSN3800/pg_profile_lookup.ini \ No newline at end of file +../Mellanox-SN3800-D112C8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers.json.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers.json.j2 new file mode 120000 index 00000000000..dc17caa0aa3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers.json.j2 @@ -0,0 +1 @@ +../ACS-MSN3800/buffers.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..67aca79510a --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers_defaults_t0.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '24360960' %} +{% set ingress_lossless_pool_xoff = '2795520' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '24360960' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..a005006db51 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/buffers_defaults_t1.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '22380544' %} +{% set ingress_lossless_pool_xoff = '4775936' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '22380544' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/pg_profile_lookup.ini new file mode 120000 index 00000000000..ccbbfa44cd9 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/pg_profile_lookup.ini @@ -0,0 +1 @@ +../Mellanox-SN3800-D112C8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/port_config.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/port_config.ini new file mode 100644 index 00000000000..5f9a4de25b9 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/port_config.ini @@ -0,0 +1,79 @@ +# name lanes alias index speed +Ethernet0 0,1,2,3 etp1 1 100000 +Ethernet4 4,5,6,7 etp2 2 100000 +Ethernet8 8,9,10,11 etp3 3 100000 +Ethernet12 12,13,14,15 etp4 4 100000 +Ethernet16 16,17,18,19 etp5 5 100000 +Ethernet20 20,21,22,23 etp6 6 100000 +Ethernet24 24,25,26,27 etp7 7 100000 +Ethernet28 28,29,30,31 etp8 8 100000 +Ethernet32 32,33 etp9a 9 50000 +Ethernet34 34,35 etp9b 9 50000 +Ethernet36 36,37 etp10a 10 50000 +Ethernet38 38,39 etp10b 10 50000 +Ethernet40 40,41 etp11a 11 50000 +Ethernet42 42,43 etp11b 11 50000 +Ethernet44 44,45 etp12a 12 50000 +Ethernet46 46,47 etp12b 12 50000 +Ethernet48 48,49,50,51 etp13 13 100000 +Ethernet52 52,53,54,55 etp14 14 100000 +Ethernet56 56,57,58,59 etp15 15 100000 +Ethernet60 60,61,62,63 etp16 16 100000 +Ethernet64 64,65,66,67 etp17 17 100000 +Ethernet68 68,69,70,71 etp18 18 100000 +Ethernet72 72,73,74,75 etp19 19 100000 +Ethernet76 76,77,78,79 etp20 20 100000 +Ethernet80 80,81,82,83 etp21 21 100000 +Ethernet84 84,85,86,87 etp22 22 100000 +Ethernet88 88,89,90,91 etp23 23 100000 +Ethernet92 92,93,94,95 etp24 24 100000 +Ethernet96 96,97,98,99 etp25 25 100000 +Ethernet100 100,101,102,103 etp26 26 100000 +Ethernet104 104,105 etp27a 27 50000 +Ethernet106 106,107 etp27b 27 50000 +Ethernet108 108,109 etp28a 28 50000 +Ethernet110 110,111 etp28b 28 50000 +Ethernet112 112,113,114,115 etp29 29 100000 +Ethernet116 116,117,118,119 etp30 30 100000 +Ethernet120 120,121,122,123 etp31 31 100000 +Ethernet124 124,125,126,127 etp32 32 100000 +Ethernet128 128,129,130,131 etp33 33 100000 +Ethernet132 132,133,134,135 etp34 34 100000 +Ethernet136 136,137,138,139 etp35 35 100000 +Ethernet140 140,141,142,143 etp36 36 100000 +Ethernet144 144,145,146,147 etp37 37 100000 +Ethernet148 148,149,150,151 etp38 38 100000 +Ethernet152 152,153,154,155 etp39 38 100000 +Ethernet156 156,157,158,159 etp40 40 100000 +Ethernet160 160,161,162,163 etp41 41 100000 +Ethernet164 164,165 etp42a 42 50000 +Ethernet166 166,167 etp42b 42 50000 +Ethernet168 168,169,170,171 etp43 43 100000 +Ethernet172 172,173,174,175 etp44 44 100000 +Ethernet176 176,177 etp45a 45 50000 +Ethernet178 178,179 etp45b 45 50000 +Ethernet180 180,181 etp46a 46 50000 +Ethernet182 182,183 etp46b 46 50000 +Ethernet184 184,185 etp47a 47 50000 +Ethernet186 186,187 etp47b 47 50000 +Ethernet188 188,189 etp48a 48 50000 +Ethernet190 190,191 etp48b 48 50000 +Ethernet192 192,193,194,195 etp49 49 100000 +Ethernet196 196,197,198,199 etp50 50 100000 +Ethernet200 200,201,202,203 etp51 51 100000 +Ethernet204 204,205,206,207 etp52 52 100000 +Ethernet208 208,209,210,211 etp53 53 100000 +Ethernet212 212,213,214,215 etp54 54 100000 +Ethernet216 216,217,218,219 etp55 55 100000 +Ethernet220 220,221,222,223 etp56 56 100000 +Ethernet224 224,225,226,227 etp57 57 100000 +Ethernet228 228,229,230,231 etp58 58 100000 +Ethernet232 232,233,234,235 etp59 59 100000 +Ethernet236 236,237,238,239 etp60 60 100000 +Ethernet240 240,241 etp61a 61 50000 +Ethernet242 242,243 etp61b 61 50000 +Ethernet244 244,245 etp62a 62 50000 +Ethernet246 246,247 etp62b 62 50000 +Ethernet248 248,249 etp63a 63 50000 +Ethernet250 250,251 etp63b 63 50000 +Ethernet252 252,253,254,255 etp64 64 10000 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/qos.json.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/qos.json.j2 new file mode 120000 index 00000000000..26b0dac5184 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/qos.json.j2 @@ -0,0 +1 @@ +../ACS-MSN3800/qos.json.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai.profile new file mode 100644 index 00000000000..24a5baa1174 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_1x10g_28x50g_49x100g.xml +SAI_VXLAN_SRCPORT_RANGE_ENABLE=1 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai_3800_1x10g_28x50g_49x100g.xml b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai_3800_1x10g_28x50g_49x100g.xml new file mode 100644 index 00000000000..5844f53f4c0 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C49S1/sai_3800_1x10g_28x50g_49x100g.xml @@ -0,0 +1,484 @@ + + + + + + 00:02:03:04:05:00 + + + 1 + + + 64 + + + + + 1 + 4 + 48 + + + 3 + + + 1536 + + + 3 + 4 + 49 + 1 + 1536 + + + 5 + 4 + 50 + 3 + 1536 + + + 7 + 4 + 51 + 1 + 1536 + + + 9 + 4 + 52 + 3 + 1536 + + + 11 + 4 + 53 + 1 + 1536 + + + 13 + 4 + 54 + 3 + 1536 + + + 15 + 4 + 55 + 1 + 1536 + + + 17 + 4 + 56 + 3 + 384 + 2 + + + 19 + 4 + 57 + 1 + 384 + 2 + + + 21 + 4 + 58 + 3 + 384 + 2 + + + 23 + 4 + 59 + 1 + 384 + 2 + + + 25 + 4 + 60 + 3 + 1536 + + + 27 + 4 + 61 + 1 + 1536 + + + 29 + 4 + 62 + 3 + 1536 + + + 31 + 4 + 63 + 1 + 1536 + + + 33 + 4 + 12 + 3 + 1536 + + + 35 + 4 + 13 + 1 + 1536 + + + 37 + 4 + 14 + 3 + 1536 + + + 39 + 4 + 15 + 1 + 1536 + + + 41 + 4 + 8 + 3 + 1536 + + + 43 + 4 + 9 + 1 + 1536 + + + 45 + 4 + 10 + 3 + 1536 + + + 47 + 4 + 11 + 1 + 1536 + + + 49 + 4 + 4 + 3 + 1536 + + + 51 + 4 + 5 + 1 + 1536 + + + 53 + 4 + 6 + 3 + 384 + 2 + + + 55 + 4 + 7 + 1 + 384 + 2 + + + 57 + 4 + 0 + 3 + 1536 + + + 59 + 4 + 1 + 1 + 1536 + + + 61 + 4 + 2 + 3 + 1536 + + + 63 + 4 + 3 + 1 + 1536 + + + 65 + 4 + 44 + 3 + 1536 + + + 67 + 4 + 45 + 1 + 1536 + + + 69 + 4 + 46 + 3 + 1536 + + + 71 + 4 + 47 + 1 + 1536 + + + 73 + 4 + 40 + 3 + 1536 + + + 75 + 4 + 41 + 1 + 1536 + + + 77 + 4 + 42 + 3 + 1536 + + + 79 + 4 + 43 + 1 + 1536 + + + 81 + 4 + 36 + 3 + 1536 + + + 83 + 4 + 37 + 1 + 384 + 2 + + + 85 + 4 + 38 + 3 + 1536 + + + 87 + 4 + 39 + 1 + 1536 + + + 89 + 4 + 32 + 3 + 384 + 2 + + + 91 + 4 + 33 + 1 + 384 + 2 + + + 93 + 4 + 34 + 3 + 384 + 2 + + + 95 + 4 + 35 + 1 + 384 + 2 + + + 97 + 4 + 16 + 3 + 1536 + + + 99 + 4 + 17 + 1 + 1536 + + + 101 + 4 + 18 + 3 + 1536 + + + 103 + 4 + 19 + 1 + 1536 + + + 105 + 4 + 20 + 3 + 1536 + + + 107 + 4 + 21 + 1 + 1536 + + + 109 + 4 + 22 + 3 + 1536 + + + 111 + 4 + 23 + 1 + 1536 + + + 113 + 4 + 24 + 3 + 1536 + + + 115 + 4 + 25 + 1 + 1536 + + + 117 + 4 + 26 + 3 + 1536 + + + 119 + 4 + 27 + 1 + 1536 + + + 121 + 4 + 28 + 3 + 384 + 2 + + + 123 + 4 + 29 + 1 + 384 + 2 + + + 125 + 4 + 30 + 3 + 384 + 2 + + + 127 + 4 + 31 + 1 + 16 + + + + diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t0.j2 deleted file mode 120000 index 0987f672486..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t0.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN3800/buffers_defaults_t0.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..67aca79510a --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t0.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '24360960' %} +{% set ingress_lossless_pool_xoff = '2795520' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '24360960' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t1.j2 deleted file mode 120000 index 119460bfa55..00000000000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t1.j2 +++ /dev/null @@ -1 +0,0 @@ -../ACS-MSN3800/buffers_defaults_t1.j2 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..a005006db51 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/buffers_defaults_t1.j2 @@ -0,0 +1,100 @@ +{% set default_cable = '5m' %} +{% set ingress_lossless_pool_size = '22380544' %} +{% set ingress_lossless_pool_xoff = '4775936' %} +{% set egress_lossless_pool_size = '34287552' %} +{% set egress_lossy_pool_size = '22380544' %} + +{%- 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)) %}{%- endif %} + {%- endfor %} +{%- endmacro %} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "{{ ingress_lossless_pool_size }}", + "xoff": "{{ ingress_lossless_pool_xoff }}", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "{{ egress_lossless_pool_size }}", + "type": "egress", + "mode": "dynamic" + }, + "egress_lossy_pool": { + "size": "{{ egress_lossy_pool_size }}", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "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", + "dynamic_th":"7" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"9216", + "dynamic_th":"7" + }, + "q_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + } + }, +{%- endmacro %} + +{%- macro generate_profile_lists(port_names) %} + "BUFFER_PORT_INGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "BUFFER_PORT_EGRESS_PROFILE_LIST": { +{% for port in port_names.split(',') %} + "{{ port }}": { + "profile_list" : "[BUFFER_PROFILE|egress_lossless_profile],[BUFFER_PROFILE|egress_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} + +{%- macro generate_queue_buffers(port_names) %} + "BUFFER_QUEUE": { +{% for port in port_names.split(',') %} + "{{ port }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|0-2": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }, +{% endfor %} +{% for port in port_names.split(',') %} + "{{ port }}|5-6": { + "profile" : "[BUFFER_PROFILE|q_lossy_profile]" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +{%- endmacro %} diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/pg_profile_lookup.ini index db2f74508aa..ccbbfa44cd9 120000 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/pg_profile_lookup.ini @@ -1 +1 @@ -../ACS-MSN3800/pg_profile_lookup.ini \ No newline at end of file +../Mellanox-SN3800-D112C8/pg_profile_lookup.ini \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile index aa37fb30dbd..60da1086ba8 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/Mellanox-SN3800-D28C50/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/sai_3800_28x50g_52x100g.xml +SAI_VXLAN_SRCPORT_RANGE_ENABLE=1 diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn3800-r0/platform_components.json index fa3b172b763..deddbcc0415 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/platform_components.json @@ -1,9 +1,14 @@ { "chassis": { - "x86_64-mlnx_msn3800-r0": { + "MSN3800": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { }, + "CPLD3": { }, + "CPLD4": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf index 9777c5e8439..7ba5f9c8c05 100644 --- a/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn3800-r0/sensors.conf @@ -93,20 +93,6 @@ bus "i2c-15" "i2c-1-mux (chan_id 6)" # Power supplies bus "i2c-4" "i2c-1-mux (chan_id 3)" chip "dps460-i2c-*-58" - label in1 "PSU-1 220V Rail (in)" - ignore in2 - label in3 "PSU-1 12V Rail (out)" - label fan1 "PSU-1 Fan 1" - ignore fan2 - ignore fan3 - label temp1 "PSU-1 Temp 1" - label temp2 "PSU-1 Temp 2" - label temp3 "PSU-1 Temp 3" - label power1 "PSU-1 220V Rail Pwr (in)" - label power2 "PSU-1 12V Rail Pwr (out)" - label curr1 "PSU-1 220V Rail Curr (in)" - label curr2 "PSU-1 12V Rail Curr (out)" - chip "dps460-i2c-*-59" label in1 "PSU-2 220V Rail (in)" ignore in2 label in3 "PSU-2 12V Rail (out)" @@ -120,6 +106,20 @@ bus "i2c-4" "i2c-1-mux (chan_id 3)" label power2 "PSU-2 12V Rail Pwr (out)" label curr1 "PSU-2 220V Rail Curr (in)" label curr2 "PSU-2 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-1 220V Rail (in)" + ignore in2 + label in3 "PSU-1 12V Rail (out)" + label fan1 "PSU-1 Fan 1" + ignore fan2 + ignore fan3 + label temp1 "PSU-1 Temp 1" + label temp2 "PSU-1 Temp 2" + label temp3 "PSU-1 Temp 3" + label power1 "PSU-1 220V Rail Pwr (in)" + label power2 "PSU-1 12V Rail Pwr (out)" + label curr1 "PSU-1 220V Rail Curr (in)" + label curr2 "PSU-1 12V Rail Curr (out)" # Chassis fans chip "mlxreg_fan-isa-*" diff --git a/device/mellanox/x86_64-mlnx_msn4600c-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn4600c-r0/platform_components.json index 300a3827a0c..22bcfcc2970 100644 --- a/device/mellanox/x86_64-mlnx_msn4600c-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn4600c-r0/platform_components.json @@ -1,7 +1,9 @@ { "chassis": { - "x86_64-mlnx_msn4600c-r0": { + "MSN4600C": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, "CPLD1": { }, "CPLD2": { }, diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t0.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t0.j2 index b71e6b35fa2..506107f4776 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t0.j2 +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t0.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '56623104' %} -{% set ingress_lossy_pool_size = '56623104' %} +{% set ingress_lossless_pool_size = '26451968' %} +{% set ingress_lossy_pool_size = '26451968' %} {% set egress_lossless_pool_size = '60817392' %} -{% set egress_lossy_pool_size = '56623104' %} +{% set egress_lossy_pool_size = '26451968' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t1.j2 b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t1.j2 index 87e55d5a46e..b025ea275ba 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t1.j2 +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/buffers_defaults_t1.j2 @@ -1,8 +1,8 @@ {% set default_cable = '5m' %} -{% set ingress_lossless_pool_size = '36011952' %} -{% set ingress_lossy_pool_size = '36011952' %} +{% set ingress_lossless_pool_size = '20627456' %} +{% set ingress_lossy_pool_size = '20627456' %} {% set egress_lossless_pool_size = '60817392' %} -{% set egress_lossy_pool_size = '36011952' %} +{% set egress_lossy_pool_size = '20627456' %} {%- macro generate_port_lists(PORT_ALL) %} {# Generate list of ports #} @@ -38,7 +38,7 @@ "ingress_lossless_profile": { "pool":"[BUFFER_POOL|ingress_lossless_pool]", "size":"0", - "dynamic_th":"0" + "dynamic_th":"7" }, "ingress_lossy_profile": { "pool":"[BUFFER_POOL|ingress_lossy_pool]", @@ -52,8 +52,8 @@ }, "egress_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", - "size":"4096", - "dynamic_th":"3" + "size":"9216", + "dynamic_th":"7" }, "q_lossy_profile": { "pool":"[BUFFER_POOL|egress_lossy_pool]", diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/pg_profile_lookup.ini b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/pg_profile_lookup.ini index 950cf943496..1fb3f9c328c 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/pg_profile_lookup.ini +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/pg_profile_lookup.ini @@ -1,25 +1,23 @@ -# speed cable size xon xoff threshold -1000 5m 32768 18432 14336 0 -10000 5m 32768 18432 14336 0 -25000 5m 33792 18432 15360 0 -40000 5m 33792 18432 15360 0 -50000 5m 33792 18432 15360 0 -100000 5m 35840 18432 17408 0 -200000 5m 37888 18432 19456 0 -400000 5m 43008 18432 24576 0 -1000 40m 32768 18432 14336 0 -10000 40m 34816 18432 16384 0 -25000 40m 37888 18432 19456 0 -40000 40m 40960 18432 22528 0 -50000 40m 43008 18432 24576 0 -100000 40m 53248 18432 34816 0 -200000 40m 72704 18432 54272 0 -400000 40m 112640 18432 94208 0 -1000 300m 34816 18432 16384 0 -10000 300m 48128 18432 29696 0 -25000 300m 70656 18432 52224 0 -40000 300m 93184 18432 74752 0 -50000 300m 108544 18432 90112 0 -100000 300m 183296 18432 164864 0 -200000 300m 333824 18432 315392 0 -400000 300m 634880 18432 616448 0 +# PG lossless profiles. +# speed cable size xon xoff threshold + 10000 5m 52224 19456 32768 0 + 25000 5m 52224 19456 32768 0 + 40000 5m 53248 19456 33792 0 + 50000 5m 53248 19456 33792 0 + 100000 5m 53248 19456 33792 0 + 200000 5m 55296 19456 35840 0 + 400000 5m 86016 37888 38912 0 + 10000 40m 53248 19456 33792 0 + 25000 40m 55296 19456 35840 0 + 40000 40m 57344 19456 37888 0 + 50000 40m 58368 19456 38912 0 + 100000 40m 63488 19456 44032 0 + 200000 40m 74752 19456 55296 0 + 400000 40m 124928 37888 77824 0 + 10000 300m 60416 19456 40960 0 + 25000 300m 73728 19456 54272 0 + 40000 300m 86016 19456 66560 0 + 50000 300m 95232 19456 75776 0 + 100000 300m 137216 19456 117760 0 + 200000 300m 223232 19456 203776 0 + 400000 300m 420864 37888 373760 0 diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai_4700.xml b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai_4700.xml index 177a79d13d6..e3d0e4ea723 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai_4700.xml +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/ACS-MSN4700/sai_4700.xml @@ -5,6 +5,9 @@ 00:02:03:04:05:00 + + 1 + 32 diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/get_sensors_conf_path b/device/mellanox/x86_64-mlnx_msn4700-r0/get_sensors_conf_path new file mode 100755 index 00000000000..c347d743541 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/get_sensors_conf_path @@ -0,0 +1,21 @@ +#!/bin/bash + +HW_VERSION="/var/run/hw-management/system/config1" +SENSORS_CONF_FILE="/usr/share/sonic/platform/sensors.conf" +SENSORS_CONF_FILE_A1="/usr/share/sonic/platform/sensors.conf.a1" + +function get_sensor_conf_path() { + local _HW_VERSION="0" + if [[ -e $HW_VERSION ]]; then + _HW_VERSION=$(cat $HW_VERSION 2>&1) + if [[ "$_HW_VERSION" == "1" ]]; then + if [[ -e $SENSORS_CONF_FILE_A1 ]]; then + echo $SENSORS_CONF_FILE_A1 + return + fi + fi + fi + echo $SENSORS_CONF_FILE +} + +get_sensor_conf_path diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/platform_components.json b/device/mellanox/x86_64-mlnx_msn4700-r0/platform_components.json index 2804e29e11b..c663b782187 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/platform_components.json +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/platform_components.json @@ -1,9 +1,13 @@ { "chassis": { - "x86_64-mlnx_msn4700-r0": { + "MSN4700": { "component": { + "ONIE": { }, + "SSD": { }, "BIOS": { }, - "CPLD": { } + "CPLD1": { }, + "CPLD2": { }, + "CPLD3": { } } } } diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn4700-r0/sensors.conf index 39fa9a5f93d..3b19dc80c6c 100644 --- a/device/mellanox/x86_64-mlnx_msn4700-r0/sensors.conf +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/sensors.conf @@ -24,108 +24,108 @@ bus "i2c-5" "i2c-1-mux (chan_id 4)" chip "xdpe12284-i2c-*-62" label in1 "PMIC-1 PSU 12V Rail (in1)" label in2 "PMIC-1 PSU 12V Rail (in2)" - label in3 "PMIC-1 ASIC 0.85V VCORE_T6_7 Rail (out)" - label in4 "PMIC-1 ASIC 1.8V T6_7 Rail (out)" + label in3 "PMIC-1 ASIC 0.8V VCORE MAIN Rail (out)" + ignore in4 label temp1 "PMIC-1 Temp 1" label temp2 "PMIC-1 Temp 2" - label power1 "PMIC-1 ASIC 0.85V VCORE_T6_7 Rail Pwr (in)" - label power2 "PMIC-1 ASIC 1.8V T6_7 Rail Pwr (in)" - label power3 "PMIC-1 ASIC 0.85V VCORE_T6_7 Rail Pwr (out)" - label power4 "PMIC-1 ASIC 1.8V T6_7 Rail Pwr (out)" - label curr1 "PMIC-1 ASIC 0.85V VCORE_T6_7 Rail Curr (in)" - label curr2 "PMIC-1 ASIC 1.8V T6_7 Rail Curr (in)" - label curr3 "PMIC-1 ASIC 0.85V VCORE_T6_7 Rail Curr (out)" - label curr4 "PMIC-1 ASIC 1.8V T6_7 Rail Curr (out)" + label power1 "PMIC-1 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-1 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-1 ASIC 0.8V VCORE MAIN Rail Pwr (out)" + ignore power4 + label curr1 "PMIC-1 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-1 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-1 ASIC 0.8V VCORE MAIN Rail Curr (out)" + ignore curr4 chip "xdpe12284-i2c-*-64" label in1 "PMIC-2 PSU 12V Rail (in1)" label in2 "PMIC-2 PSU 12V Rail (in2)" - label in3 "PMIC-2 ASIC 0.85V VCORE_T6_7 Rail (out)" - label in4 "PMIC-2 ASIC 1.8V T6_7 Rail (out)" + label in3 "PMIC-2 ASIC 1.8V VCORE MAIN Rail (out)" + label in4 "PMIC-2 ASIC 1.2V VCORE MAIN Rail (out)" label temp1 "PMIC-2 Temp 1" label temp2 "PMIC-2 Temp 2" - label power1 "PMIC-2 ASIC 0.85V VCORE_T6_7 Rail Pwr (in)" - label power2 "PMIC-2 ASIC 1.8V T6_7 Rail Pwr (in)" - label power3 "PMIC-2 ASIC 0.85V VCORE_T6_7 Rail Pwr (out)" - label power4 "PMIC-2 ASIC 1.8V T6_7 Rail Pwr (out)" - label curr1 "PMIC-2 ASIC 0.85V VCORE_T6_7 Rail Curr (in)" - label curr2 "PMIC-2 ASIC 1.8V T6_7 Rail Curr (in)" - label curr3 "PMIC-2 ASIC 0.85V VCORE_T6_7 Rail Curr (out)" - label curr4 "PMIC-2 ASIC 1.8V T6_7 Rail Curr (out)" + label power1 "PMIC-2 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-2 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-2 ASIC 1.8V VCORE MAIN Rail Pwr (out)" + label power4 "PMIC-2 ASIC 1.2V VCORE MAIN Rail Pwr (out)" + label curr1 "PMIC-2 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-2 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-2 ASIC 1.8V VCORE MAIN Rail Curr (out)" + label curr4 "PMIC-2 ASIC 1.2V VCORE MAIN Rail Curr (out)" chip "xdpe12284-i2c-*-66" label in1 "PMIC-3 PSU 12V Rail (in1)" label in2 "PMIC-3 PSU 12V Rail (in2)" - label in3 "PMIC-3 ASIC 0.85V VCORE_T6_7 Rail (out)" - label in4 "PMIC-3 ASIC 1.8V T6_7 Rail (out)" + label in3 "PMIC-3 ASIC 0.85V T0_1 Rail (out)" + label in4 "PMIC-3 ASIC 1.8V T0_1 Rail (out)" label temp1 "PMIC-3 Temp 1" label temp2 "PMIC-3 Temp 2" - label power1 "PMIC-3 ASIC 0.85V VCORE_T6_7 Rail Pwr (in)" - label power2 "PMIC-3 ASIC 1.8V T6_7 Rail Pwr (in)" - label power3 "PMIC-3 ASIC 0.85V VCORE_T6_7 Rail Pwr (out)" - label power4 "PMIC-3 ASIC 1.8V T6_7 Rail Pwr (out)" - label curr1 "PMIC-3 ASIC 0.85V VCORE_T6_7 Rail Curr (in)" - label curr2 "PMIC-3 ASIC 1.8V T6_7 Rail Curr (in)" - label curr3 "PMIC-3 ASIC 0.85V VCORE_T6_7 Rail Curr (out)" - label curr4 "PMIC-3 ASIC 1.8V T6_7 Rail Curr (out)" + label power1 "PMIC-3 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-3 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-3 ASIC 0.85V T0_1 Rail Pwr (out)" + label power4 "PMIC-3 ASIC 1.8V T0_1 Rail Pwr (out)" + label curr1 "PMIC-3 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-3 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-3 ASIC 0.85V T0_1 Rail Curr (out)" + label curr4 "PMIC-3 ASIC 1.8V T0_1 Rail Curr (out)" chip "xdpe12284-i2c-*-68" label in1 "PMIC-4 PSU 12V Rail (in1)" label in2 "PMIC-4 PSU 12V Rail (in2)" - label in3 "PMIC-4 ASIC 0.85V VCORE_T6_7 Rail (out)" - label in4 "PMIC-4 ASIC 1.8V T6_7 Rail (out)" + label in3 "PMIC-4 ASIC 0.85V T2_3 Rail (out)" + label in4 "PMIC-4 ASIC 1.8V T2_3 Rail (out)" label temp1 "PMIC-4 Temp 1" label temp2 "PMIC-4 Temp 2" - label power1 "PMIC-4 ASIC 0.85V VCORE_T6_7 Rail Pwr (in)" - label power2 "PMIC-4 ASIC 1.8V T6_7 Rail Pwr (in)" - label power3 "PMIC-4 ASIC 0.85V VCORE_T6_7 Rail Pwr (out)" - label power4 "PMIC-4 ASIC 1.8V T6_7 Rail Pwr (out)" - label curr1 "PMIC-4 ASIC 0.85V VCORE_T6_7 Rail Curr (in)" - label curr2 "PMIC-4 ASIC 1.8V T6_7 Rail Curr (in)" - label curr3 "PMIC-4 ASIC 0.85V VCORE_T6_7 Rail Curr (out)" - label curr4 "PMIC-4 ASIC 1.8V T6_7 Rail Curr (out)" + label power1 "PMIC-4 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-4 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-4 ASIC 0.85V T2_3 Rail Pwr (out)" + label power4 "PMIC-4 ASIC 1.8V T2_3 Rail Pwr (out)" + label curr1 "PMIC-4 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-4 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-4 ASIC 0.85V T2_3 Rail Curr (out)" + label curr4 "PMIC-4 ASIC 1.8V T2_3 Rail Curr (out)" chip "xdpe12284-i2c-*-6a" label in1 "PMIC-5 PSU 12V Rail (in1)" label in2 "PMIC-5 PSU 12V Rail (in2)" - label in3 "PMIC-5 ASIC 0.85V VCORE_T6_7 Rail (out)" - label in4 "PMIC-5 ASIC 1.8V T6_7 Rail (out)" + label in3 "PMIC-5 ASIC 0.85V T4_5 Rail (out)" + label in4 "PMIC-5 ASIC 1.8V T4_5 Rail (out)" label temp1 "PMIC-5 Temp 1" label temp2 "PMIC-5 Temp 2" - label power1 "PMIC-5 ASIC 0.85V VCORE_T6_7 Rail Pwr (in)" - label power2 "PMIC-5 ASIC 1.8V T6_7 Rail Pwr (in)" - label power3 "PMIC-5 ASIC 0.85V VCORE_T6_7 Rail Pwr (out)" - label power4 "PMIC-5 ASIC 1.8V T6_7 Rail Pwr (out)" - label curr1 "PMIC-5 ASIC 0.85V VCORE_T6_7 Rail Curr (in)" - label curr2 "PMIC-5 ASIC 1.8V T6_7 Rail Curr (in)" - label curr3 "PMIC-5 ASIC 0.85V VCORE_T6_7 Rail Curr (out)" - label curr4 "PMIC-5 ASIC 1.8V T6_7 Rail Curr (out)" + label power1 "PMIC-5 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-5 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-5 ASIC 0.85V T4_5 Rail Pwr (out)" + label power4 "PMIC-5 ASIC 1.8V T4_5 Rail Pwr (out)" + label curr1 "PMIC-5 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-5 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-5 ASIC 0.85V T4_5 Rail Curr (out)" + label curr4 "PMIC-5 ASIC 1.8V T4_5 Rail Curr (out)" chip "xdpe12284-i2c-*-6c" label in1 "PMIC-6 PSU 12V Rail (in1)" label in2 "PMIC-6 PSU 12V Rail (in2)" - label in3 "PMIC-6 ASIC 0.85V VCORE_T6_7 Rail (out)" + label in3 "PMIC-6 ASIC 0.85V T6_7 Rail (out)" label in4 "PMIC-6 ASIC 1.8V T6_7 Rail (out)" label temp1 "PMIC-6 Temp 1" label temp2 "PMIC-6 Temp 2" - label power1 "PMIC-6 ASIC 0.85V VCORE_T6_7 Rail Pwr (in)" - label power2 "PMIC-6 ASIC 1.8V T6_7 Rail Pwr (in)" - label power3 "PMIC-6 ASIC 0.85V VCORE_T6_7 Rail Pwr (out)" + label power1 "PMIC-6 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-6 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-6 ASIC 0.85V T6_7 Rail Pwr (out)" label power4 "PMIC-6 ASIC 1.8V T6_7 Rail Pwr (out)" - label curr1 "PMIC-6 ASIC 0.85V VCORE_T6_7 Rail Curr (in)" - label curr2 "PMIC-6 ASIC 1.8V T6_7 Rail Curr (in)" - label curr3 "PMIC-6 ASIC 0.85V VCORE_T6_7 Rail Curr (out)" + label curr1 "PMIC-6 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-6 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-6 ASIC 0.85V T6_7 Rail Curr (out)" label curr4 "PMIC-6 ASIC 1.8V T6_7 Rail Curr (out)" chip "xdpe12284-i2c-*-6e" label in1 "PMIC-7 PSU 12V Rail (in1)" label in2 "PMIC-7 PSU 12V Rail (in2)" - label in3 "PMIC-7 ASIC 0.85V VCORE_T6_7 Rail (out)" - label in4 "PMIC-7 ASIC 1.8V T6_7 Rail (out)" + label in3 "PMIC-7 ASIC 1.2V T0_3 Rail_1 (out)" + label in4 "PMIC-7 ASIC 1.2V T4_7 Rail_2 (out)" label temp1 "PMIC-7 Temp 1" label temp2 "PMIC-7 Temp 2" - label power1 "PMIC-7 ASIC 0.85V VCORE_T6_7 Rail Pwr (in)" - label power2 "PMIC-7 ASIC 1.8V T6_7 Rail Pwr (in)" - label power3 "PMIC-7 ASIC 0.85V VCORE_T6_7 Rail Pwr (out)" - label power4 "PMIC-7 ASIC 1.8V T6_7 Rail Pwr (out)" - label curr1 "PMIC-7 ASIC 0.85V VCORE_T6_7 Rail Curr (in)" - label curr2 "PMIC-7 ASIC 1.8V T6_7 Rail Curr (in)" - label curr3 "PMIC-7 ASIC 0.85V VCORE_T6_7 Rail Curr (out)" - label curr4 "PMIC-7 ASIC 1.8V T6_7 Rail Curr (out)" + label power1 "PMIC-7 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-7 PSU 12V Rail Pwr (in2)" + label power3 "PMIC-7 ASIC 1.2V T0_3 Rail_1 Pwr (out)" + label power4 "PMIC-7 ASIC 1.2V T4_7 Rail_2 Pwr (out)" + label curr1 "PMIC-7 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-7 PSU 12V Rail Curr (in2)" + label curr3 "PMIC-7 ASIC 1.2V T0_3 Rail_1 Curr (out)" + label curr4 "PMIC-7 ASIC 1.2V T4_7 Rail_2 Curr (out)" bus "i2c-15" "i2c-1-mux (chan_id 6)" chip "tps53679-i2c-*-58" diff --git a/device/mellanox/x86_64-mlnx_msn4700-r0/sensors.conf.a1 b/device/mellanox/x86_64-mlnx_msn4700-r0/sensors.conf.a1 new file mode 100644 index 00000000000..5accf4b669e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn4700-r0/sensors.conf.a1 @@ -0,0 +1,142 @@ +################################################################################ +# Copyright (c) 2019 Mellanox Technologies +# +# Platform specific sensors config for SN4700 A0/A1 +################################################################################ + +# Temperature sensors +bus "i2c-2" "i2c-1-mux (chan_id 1)" + chip "mlxsw-i2c-*-48" + label temp1 "Ambient ASIC Temp" + +bus "i2c-7" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-*-49" + label temp1 "Ambient Fan Side Temp (air intake)" + chip "tmp102-i2c-*-4a" + label temp1 "Ambient Port Side Temp (air exhaust)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tmp102-i2c-15-49" + label temp1 "Ambient COMEX Temp" + +# Power controllers +bus "i2c-5" "i2c-1-mux (chan_id 4)" + chip "mp2975-i2c-*-62" + label in1 "PMIC-1 PSU 12V Rail (in1)" + label in2 "PMIC-1 ASIC 0.8V VCORE MAIN Rail (out)" + label temp1 "PMIC-1 Temp 1" + label power1 "PMIC-1 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-1 ASIC 0.8V VCORE MAIN Rail Pwr (out)" + label curr1 "PMIC-1 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-1 ASIC 0.8V VCORE MAIN Rail Curr (out)" + chip "mp2975-i2c-*-64" + label in1 "PMIC-2 PSU 12V Rail (in1)" + label in2 "PMIC-2 ASIC 1.8V VCORE MAIN Rail (out)" + label in3 "PMIC-2 ASIC 1.2V VCORE MAIN Rail (out)" + label temp1 "PMIC-2 Temp 1" + label power1 "PMIC-2 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-2 ASIC 1.8V VCORE MAIN Rail Pwr (out)" + label curr1 "PMIC-2 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-2 ASIC 1.8V VCORE MAIN Rail Curr (out)" + label curr3 "PMIC-2 ASIC 1.2V VCORE MAIN Rail Curr (out)" + chip "mp2975-i2c-*-66" + label in1 "PMIC-3 PSU 12V Rail (in1)" + label in2 "PMIC-3 ASIC 0.85V T0_1 Rail (out)" + label in3 "PMIC-3 ASIC 1.8V T0_1 Rail (out)" + label temp1 "PMIC-3 Temp 1" + label power1 "PMIC-3 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-3 ASIC 0.85V T0_1 Rail Pwr (out)" + label curr1 "PMIC-3 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-3 ASIC 0.85V T0_1 Rail Curr (out)" + label curr3 "PMIC-3 ASIC 1.8V T0_1 Rail Curr (out)" + chip "mp2975-i2c-*-6a" + label in1 "PMIC-4 PSU 12V Rail (in1)" + label in2 "PMIC-4 ASIC 0.85V T2_3 Rail (out)" + label in3 "PMIC-4 ASIC 1.8V T2_3 Rail (out)" + label temp1 "PMIC-4 Temp 1" + label power1 "PMIC-4 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-4 ASIC 0.85V T2_3 Rail Pwr (out)" + label curr1 "PMIC-4 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-4 ASIC 0.85V T2_3 Rail Curr (out)" + label curr3 "PMIC-4 ASIC 1.8V T2_3 Rail Curr (out)" + chip "mp2975-i2c-*-6e" + label in1 "PMIC-5 PSU 12V Rail (in1)" + label in2 "PMIC-5 ASIC 1.2V T0_3 Rail_1 (out)" + label in3 "PMIC-5 ASIC 1.2V T4_7 Rail_2 (out)" + label temp1 "PMIC-5 Temp 1" + label power1 "PMIC-5 PSU 12V Rail Pwr (in1)" + label power2 "PMIC-5 ASIC 1.2V T0_3 Rail_1 Pwr (out)" + label power3 "PMIC-5 ASIC 1.2V T4_7 Rail_2 Pwr (out)" + label curr1 "PMIC-5 PSU 12V Rail Curr (in1)" + label curr2 "PMIC-5 ASIC 1.2V T0_3 Rail_1 Curr (out)" + label curr3 "PMIC-5 ASIC 1.2V T4_7 Rail_2 Curr (out)" + +bus "i2c-15" "i2c-1-mux (chan_id 6)" + chip "tps53679-i2c-*-58" + label in1 "PMIC-8 PSU 12V Rail (in1)" + label in2 "PMIC-8 PSU 12V Rail (in2)" + label in3 "PMIC-8 COMEX 1.8V Rail (out)" + label in4 "PMIC-8 COMEX 1.05V Rail (out)" + label temp1 "PMIC-8 Temp 1" + label temp2 "PMIC-8 Temp 2" + label power1 "PMIC-8 COMEX 1.8V Rail Pwr (out)" + label power2 "PMIC-8 COMEX 1.05V Rail Pwr (out)" + label curr1 "PMIC-8 COMEX 1.8V Rail Curr (out)" + label curr2 "PMIC-8 COMEX 1.05V Rail Curr (out)" + chip "tps53679-i2c-*-61" + label in1 "PMIC-9 PSU 12V Rail (in1)" + label in2 "PMIC-9 PSU 12V Rail (in2)" + label in3 "PMIC-9 COMEX 1.2V Rail (out)" + ignore in4 + label temp1 "PMIC-9 Temp 1" + label temp2 "PMIC-9 Temp 2" + label power1 "PMIC-9 COMEX 1.2V Rail Pwr (out)" + ignore power2 + label curr1 "PMIC-9 COMEX 1.2V Rail Curr (out)" + ignore curr2 + +# Power supplies +bus "i2c-4" "i2c-1-mux (chan_id 3)" + chip "dps460-i2c-*-58" + label in1 "PSU-1(L) 220V Rail (in)" + ignore in2 + label in3 "PSU-1(L) 12V Rail (out)" + label fan1 "PSU-1(L) Fan 1" + label temp1 "PSU-1(L) Temp 1" + label temp2 "PSU-1(L) Temp 2" + label temp3 "PSU-1(L) Temp 3" + label power1 "PSU-1(L) 220V Rail Pwr (in)" + label power2 "PSU-1(L) 12V Rail Pwr (out)" + label curr1 "PSU-1(L) 220V Rail Curr (in)" + label curr2 "PSU-1(L) 12V Rail Curr (out)" + chip "dps460-i2c-*-59" + label in1 "PSU-2(R) 220V Rail (in)" + ignore in2 + label in3 "PSU-2(R) 12V Rail (out)" + label fan1 "PSU-2(R) Fan 1" + label temp1 "PSU-2(R) Temp 1" + label temp2 "PSU-2(R) Temp 2" + label temp3 "PSU-2(R) Temp 3" + label power1 "PSU-2(R) 220V Rail Pwr (in)" + label power2 "PSU-2(R) 12V Rail Pwr (out)" + label curr1 "PSU-2(R) 220V Rail Curr (in)" + label curr2 "PSU-2(R) 12V Rail Curr (out)" + +# Chassis fans +chip "mlxreg_fan-isa-*" + label fan1 "Chassis Fan Drawer-1 Tach 1" + label fan2 "Chassis Fan Drawer-1 Tach 2" + label fan3 "Chassis Fan Drawer-2 Tach 1" + label fan4 "Chassis Fan Drawer-2 Tach 2" + label fan5 "Chassis Fan Drawer-3 Tach 1" + label fan6 "Chassis Fan Drawer-3 Tach 2" + label fan7 "Chassis Fan Drawer-4 Tach 1" + label fan8 "Chassis Fan Drawer-4 Tach 2" + label fan9 "Chassis Fan Drawer-5 Tach 1" + label fan10 "Chassis Fan Drawer-5 Tach 2" + label fan11 "Chassis Fan Drawer-6 Tach 1" + label fan12 "Chassis Fan Drawer-6 Tach 2" + +# Miscellaneous +chip "*-virtual-*" + ignore temp1 diff --git a/device/mellanox/x86_64-mlnx_msn4700_simx-r0/pmon_daemon_control.json b/device/mellanox/x86_64-mlnx_msn4700_simx-r0/pmon_daemon_control.json index 40fc367acf3..4650f9a5eee 100644 --- a/device/mellanox/x86_64-mlnx_msn4700_simx-r0/pmon_daemon_control.json +++ b/device/mellanox/x86_64-mlnx_msn4700_simx-r0/pmon_daemon_control.json @@ -1,5 +1,6 @@ { "skip_ledd": true, "skip_xcvrd": true, - "skip_psud": true + "skip_psud": true, + "skip_thermalctld": true } diff --git a/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/sai.profile b/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/sai.profile index a58c3ac6eab..c32774b9677 100644 --- a/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/sai.profile +++ b/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-ly1200-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/th-ly1200-32x100G.config.bcm b/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/th-ly1200-32x100G.config.bcm index 84b2c572664..9bf869f16bc 100644 --- a/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/th-ly1200-32x100G.config.bcm +++ b/device/mitac/x86_64-mitac_ly1200_b32h0_c3-r0/MiTAC-LY1200-B32H0-C3/th-ly1200-32x100G.config.bcm @@ -1,6 +1,6 @@ ### BMS (start) ## Global settings -bcm_num_cos=8 +bcm_num_cos=10 dport_map_indexed=0 ## Switch settings diff --git a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/Quanta-IX1B-32X/sai.profile b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/Quanta-IX1B-32X/sai.profile index fbd01105a4f..219465108df 100755 --- a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/Quanta-IX1B-32X/sai.profile +++ b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/Quanta-IX1B-32X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th-ix1b-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/sai.profile b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/sai.profile index 8088d09edc1..367f18e369f 100644 --- a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/sai.profile +++ b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-ix7-32x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/td3-ix7-32x100G.config.bcm b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/td3-ix7-32x100G.config.bcm index 54abc9ddae7..aaea0380e50 100644 --- a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/td3-ix7-32x100G.config.bcm +++ b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/td3-ix7-32x100G.config.bcm @@ -8,7 +8,7 @@ l3_mem_entries=40960 fpem_mem_entries=16384 l2xmsg_mode=1 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 diff --git a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/sai.profile b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/sai.profile index faf28ace4c1..62ee26ea8c1 100644 --- a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/sai.profile +++ b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-ix8-48x25G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/td3-ix8-48x25G+8x100G.config.bcm b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/td3-ix8-48x25G+8x100G.config.bcm index e4c8f8b656e..407105d0ca0 100644 --- a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/td3-ix8-48x25G+8x100G.config.bcm +++ b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/td3-ix8-48x25G+8x100G.config.bcm @@ -8,7 +8,7 @@ l3_mem_entries=40960 fpem_mem_entries=16384 l2xmsg_mode=1 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 diff --git a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/sai.profile b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/sai.profile index 04b43d5a4d3..936f0d0cddc 100644 --- a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/sai.profile +++ b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-ix8c-48x25G+8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm index e4c8f8b656e..407105d0ca0 100644 --- a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm +++ b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/td3-ix8c-48x25G+8x100G.config.bcm @@ -8,7 +8,7 @@ l3_mem_entries=40960 fpem_mem_entries=16384 l2xmsg_mode=1 -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile index 54b62b1d097..70397851c90 100644 --- a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th3-ix9-32x400G.config.bcm +SAI_NUM_ECMP_MEMBERS=64 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/installer.conf b/device/virtual/x86_64-kvm_x86_64-r0/installer.conf index e69de29bb2d..530ee964f33 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/installer.conf +++ b/device/virtual/x86_64-kvm_x86_64-r0/installer.conf @@ -0,0 +1 @@ +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="swiotlb=65536" diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers.json.j2 new file mode 100644 index 00000000000..b67cf577ab7 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't1' %} +{%- include 'buffers_config.j2' %} + diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_def.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_def.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_def.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_t0.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_t0.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_t1.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/buffers_defaults_t1.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/lanemap.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/lanemap.ini new file mode 100644 index 00000000000..d2b9e31ecad --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/lanemap.ini @@ -0,0 +1,8 @@ +eth1:1,2,3,4 +eth2:5,6,7,8 +eth3:9,10,11,12 +eth4:13,14,15,16 +eth5:17,18,19,20 +eth6:21,22,23,24 +eth7:25,26,27,28 +eth8:29,30,31,32 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/pg_profile_lookup.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/pg_profile_lookup.ini new file mode 100644 index 00000000000..9f2eacb6fc4 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/pg_profile_lookup.ini @@ -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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/port_config.ini new file mode 100644 index 00000000000..8132f1c73db --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/port_config.ini @@ -0,0 +1,9 @@ +# name lanes alias index asic_port_name role +Ethernet0 1,2,3,4 Ethernet1/1 0 Eth0-ASIC0 Ext +Ethernet4 5,6,7,8 Ethernet1/2 1 Eth1-ASIC0 Ext +Ethernet8 9,10,11,12 Ethernet1/3 2 Eth2-ASIC0 Ext +Ethernet12 13,14,15,16 Ethernet1/4 3 Eth3-ASIC0 Ext +Ethernet-BP0 17,18,19,20 Eth4-ASIC0 0 Eth4-ASIC0 Int +Ethernet-BP4 21,22,23,24 Eth5-ASIC0 1 Eth5-ASIC0 Int +Ethernet-BP8 25,26,27,28 Eth6-ASIC0 2 Eth6-ASIC0 Int +Ethernet-BP12 29,30,31,32 Eth7-ASIC0 3 Eth7-ASIC0 Int diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/qos.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/qos.json.j2 new file mode 100644 index 00000000000..3e548325ea3 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/sai.profile b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/sai.profile new file mode 100644 index 00000000000..0a2df177f1c --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/sai.profile @@ -0,0 +1,3 @@ +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/td2-s6000-32x40G.config.bcm new file mode 100644 index 00000000000..0e25b4d4232 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/0/td2-s6000-32x40G.config.bcm @@ -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=10 +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers.json.j2 new file mode 100644 index 00000000000..b67cf577ab7 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't1' %} +{%- include 'buffers_config.j2' %} + diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_def.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_def.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_def.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_t0.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_t0.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_t1.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/buffers_defaults_t1.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/lanemap.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/lanemap.ini new file mode 100644 index 00000000000..d2b9e31ecad --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/lanemap.ini @@ -0,0 +1,8 @@ +eth1:1,2,3,4 +eth2:5,6,7,8 +eth3:9,10,11,12 +eth4:13,14,15,16 +eth5:17,18,19,20 +eth6:21,22,23,24 +eth7:25,26,27,28 +eth8:29,30,31,32 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/pg_profile_lookup.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/pg_profile_lookup.ini new file mode 100644 index 00000000000..9f2eacb6fc4 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/pg_profile_lookup.ini @@ -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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/port_config.ini new file mode 100644 index 00000000000..cf9982d9171 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/port_config.ini @@ -0,0 +1,9 @@ +# name lanes alias index asic_port_name role +Ethernet16 1,2,3,4 Ethernet1/5 4 Eth0-ASIC1 Ext +Ethernet20 5,6,7,8 Ethernet1/6 5 Eth1-ASIC1 Ext +Ethernet24 9,10,11,12 Ethernet1/7 6 Eth2-ASIC1 Ext +Ethernet28 13,14,15,16 Ethernet1/8 7 Eth3-ASIC1 Ext +Ethernet-BP16 17,18,19,20 Eth4-ASIC1 4 Eth4-ASIC1 Int +Ethernet-BP20 21,22,23,24 Eth5-ASIC1 5 Eth5-ASIC1 Int +Ethernet-BP24 25,26,27,28 Eth6-ASIC1 6 Eth6-ASIC1 Int +Ethernet-BP28 29,30,31,32 Eth7-ASIC1 7 Eth7-ASIC1 Int diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/qos.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/qos.json.j2 new file mode 100644 index 00000000000..3e548325ea3 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/sai.profile b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/sai.profile new file mode 100644 index 00000000000..0a2df177f1c --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/sai.profile @@ -0,0 +1,3 @@ +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/td2-s6000-32x40G.config.bcm new file mode 100644 index 00000000000..0e25b4d4232 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/1/td2-s6000-32x40G.config.bcm @@ -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=10 +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers.json.j2 new file mode 100644 index 00000000000..b67cf577ab7 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't1' %} +{%- include 'buffers_config.j2' %} + diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_def.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_def.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_def.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_t0.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_t0.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_t1.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/buffers_defaults_t1.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/lanemap.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/lanemap.ini new file mode 100644 index 00000000000..d2b9e31ecad --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/lanemap.ini @@ -0,0 +1,8 @@ +eth1:1,2,3,4 +eth2:5,6,7,8 +eth3:9,10,11,12 +eth4:13,14,15,16 +eth5:17,18,19,20 +eth6:21,22,23,24 +eth7:25,26,27,28 +eth8:29,30,31,32 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/pg_profile_lookup.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/pg_profile_lookup.ini new file mode 100644 index 00000000000..9f2eacb6fc4 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/pg_profile_lookup.ini @@ -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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/port_config.ini new file mode 100644 index 00000000000..a4361c7b78d --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/port_config.ini @@ -0,0 +1,9 @@ +# name lanes alias index asic_port_name role +Ethernet-BP32 1,2,3,4 Eth0-ASIC2 8 Eth0-ASIC2 Int +Ethernet-BP36 5,6,7,8 Eth1-ASIC2 9 Eth1-ASIC2 Int +Ethernet-BP40 9,10,11,12 Eth2-ASIC2 10 Eth2-ASIC2 Int +Ethernet-BP44 13,14,15,16 Eth3-ASIC2 11 Eth3-ASIC2 Int +Ethernet-BP48 17,18,19,20 Eth4-ASIC2 12 Eth4-ASIC2 Int +Ethernet-BP52 21,22,23,24 Eth5-ASIC2 13 Eth5-ASIC2 Int +Ethernet-BP56 25,26,27,28 Eth6-ASIC2 14 Eth6-ASIC2 Int +Ethernet-BP60 29,30,31,32 Eth7-ASIC2 15 Eth7-ASIC2 Int diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/qos.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/qos.json.j2 new file mode 100644 index 00000000000..3e548325ea3 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/sai.profile b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/sai.profile new file mode 100644 index 00000000000..0a2df177f1c --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/sai.profile @@ -0,0 +1,3 @@ +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/td2-s6000-32x40G.config.bcm new file mode 100644 index 00000000000..0e25b4d4232 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/2/td2-s6000-32x40G.config.bcm @@ -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=10 +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers.json.j2 new file mode 100644 index 00000000000..b67cf577ab7 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't1' %} +{%- include 'buffers_config.j2' %} + diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_def.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_def.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_def.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_t0.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_t0.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_t0.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_t1.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..38e34eb571e --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/buffers_defaults_t1.j2 @@ -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 %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/lanemap.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/lanemap.ini new file mode 100644 index 00000000000..d2b9e31ecad --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/lanemap.ini @@ -0,0 +1,8 @@ +eth1:1,2,3,4 +eth2:5,6,7,8 +eth3:9,10,11,12 +eth4:13,14,15,16 +eth5:17,18,19,20 +eth6:21,22,23,24 +eth7:25,26,27,28 +eth8:29,30,31,32 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/pg_profile_lookup.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/pg_profile_lookup.ini new file mode 100644 index 00000000000..9f2eacb6fc4 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/pg_profile_lookup.ini @@ -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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/port_config.ini new file mode 100644 index 00000000000..e97ded4527b --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/port_config.ini @@ -0,0 +1,9 @@ +# name lanes alias index asic_port_name role +Ethernet-BP64 1,2,3,4 Eth0-ASIC3 16 Eth0-ASIC3 Int +Ethernet-BP68 5,6,7,8 Eth1-ASIC3 17 Eth1-ASIC3 Int +Ethernet-BP72 9,10,11,12 Eth2-ASIC3 18 Eth2-ASIC3 Int +Ethernet-BP76 13,14,15,16 Eth3-ASIC3 19 Eth3-ASIC3 Int +Ethernet-BP80 17,18,19,20 Eth4-ASIC3 20 Eth4-ASIC3 Int +Ethernet-BP84 21,22,23,24 Eth5-ASIC3 21 Eth5-ASIC3 Int +Ethernet-BP92 25,26,27,28 Eth6-ASIC3 22 Eth6-ASIC3 Int +Ethernet-BP96 29,30,31,32 Eth7-ASIC3 23 Eth7-ASIC3 Int diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/qos.json.j2 b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/qos.json.j2 new file mode 100644 index 00000000000..3e548325ea3 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/qos.json.j2 @@ -0,0 +1 @@ +{%- include 'qos_config.j2' %} diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/sai.profile b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/sai.profile new file mode 100644 index 00000000000..0a2df177f1c --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/sai.profile @@ -0,0 +1,3 @@ +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/td2-s6000-32x40G.config.bcm new file mode 100644 index 00000000000..0e25b4d4232 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/3/td2-s6000-32x40G.config.bcm @@ -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=10 +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 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/topology.sh b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/topology.sh new file mode 100755 index 00000000000..d7f370fdf39 --- /dev/null +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_four_asic_vs/topology.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# Topolgy script for 4 ASIC PLATFORM +# 2 frontend asic , 2 backend asic. +# 8 front-panel interfaces. +FIRST_FRONTEND_ASIC=0 +LAST_FRONTEND_ASIC=1 +FIRST_BACKEND_ASIC=2 +LAST_BACKEND_ASIC=3 +NUM_INTERFACES_PER_ASIC=8 + +start () { + # Move external links into assigned frontend namespaces + # eth0 - eth15: asic2 + # eth16 - eth31: asic3 + # eth32 - eth47: asic4 + # eth48 - eth63: asic5 + for ASIC in `seq $FIRST_FRONTEND_ASIC $LAST_FRONTEND_ASIC`; do + for NUM in `seq 1 4`; do + ORIG="eth$((4 * $ASIC + $NUM))" + TEMP="ethTemp999" + NEW="eth$(($NUM))" + echo "$ASIC : $NEW old $ORIG" + ip link set dev $ORIG down + ip link set dev $ORIG name $TEMP # rename to prevent conflicts before renaming in new namespace + ip link set dev $TEMP netns asic$ASIC + sudo ip netns exec asic$ASIC ip link set $TEMP name $NEW # rename too final interface name + sudo ip netns exec asic$ASIC ip link set dev $NEW mtu 9100 + sudo ip netns exec asic$ASIC ip link set $NEW up + done + done + + # Connect all backend namespaces to frontend namespaces + for BACKEND in `seq $FIRST_BACKEND_ASIC $LAST_BACKEND_ASIC`; do + for FRONTEND in `seq $FIRST_FRONTEND_ASIC $LAST_FRONTEND_ASIC`; do + for LINK in `seq 1 2`; do + FRONT_NAME="eth$((2 * $(($BACKEND - $FIRST_BACKEND_ASIC)) + $LINK + 4))" + BACK_NAME="eth$((2 * $FRONTEND + $LINK))" + echo "$FRONTEND:$FRONT_NAME - $BACKEND:$BACK_NAME" + TEMP_BACK="ethBack999" + TEMP_FRONT="ethFront999" + ip link add $TEMP_BACK type veth peer name $TEMP_FRONT # temporary name to prevent conflicts between interfaces + ip link set dev $TEMP_BACK netns asic$BACKEND + ip link set dev $TEMP_FRONT netns asic$FRONTEND + + sudo ip netns exec asic$BACKEND ip link set $TEMP_BACK name $BACK_NAME + sudo ip netns exec asic$FRONTEND ip link set $TEMP_FRONT name $FRONT_NAME + + sudo ip netns exec asic$BACKEND ip link set dev $BACK_NAME mtu 9100 + sudo ip netns exec asic$BACKEND ip link set $BACK_NAME up + sudo ip netns exec asic$FRONTEND ip link set dev $FRONT_NAME mtu 9100 + sudo ip netns exec asic$FRONTEND ip link set $FRONT_NAME up + done + done + done +} +stop() { + for ASIC in `seq $FIRST_FRONTEND_ASIC $LAST_FRONTEND_ASIC`; do + for NUM in `seq 1 4`; do + TEMP="eth999" + OLD="eth$(($NUM))" + NAME="eth$((4 * $ASIC + $NUM))" + sudo ip netns exec asic$ASIC ip link set dev $OLD down + sudo ip netns exec asic$ASIC ip link set dev $OLD name $TEMP + sudo ip netns exec asic$ASIC ip link set dev $TEMP netns 1 + ip link set dev $TEMP name $NAME + ip link set dev $NAME up + done + done + + for ASIC in `seq $FIRST_BACKEND_ASIC $LAST_BACKEND_ASIC`; do + for NUM in `seq 1 4`; do + sudo ip netns exec asic$ASIC ip link set dev eth$NUM down + sudo ip netns exec asic$ASIC ip link delete dev eth$NUM + done + done +} + +case "$1" in + start|stop) + $1 + ;; + *) + echo "Usage: $0 {start|stop}" + ;; +esac diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/port_config.ini index 95cf5eec9e4..3ec90708cc0 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/port_config.ini +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/port_config.ini @@ -1,33 +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 +# name lanes alias index asic_port_name role speed +Ethernet0 25,26,27,28 Ethernet1/1 0 Eth0-ASIC0 Ext 40000 +Ethernet4 29,30,31,32 Ethernet1/2 1 Eth1-ASIC0 Ext 40000 +Ethernet8 33,34,35,36 Ethernet1/3 2 Eth2-ASIC0 Ext 40000 +Ethernet12 37,38,39,40 Ethernet1/4 3 Eth3-ASIC0 Ext 40000 +Ethernet16 45,46,47,48 Ethernet1/5 4 Eth4-ASIC0 Ext 40000 +Ethernet20 41,42,43,44 Ethernet1/6 5 Eth5-ASIC0 Ext 40000 +Ethernet24 1,2,3,4 Ethernet1/7 6 Eth6-ASIC0 Ext 40000 +Ethernet28 5,6,7,8 Ethernet1/8 7 Eth7-ASIC0 Ext 40000 +Ethernet32 13,14,15,16 Ethernet1/9 8 Eth8-ASIC0 Ext 40000 +Ethernet36 9,10,11,12 Ethernet1/10 9 Eth9-ASIC0 Ext 40000 +Ethernet40 17,18,19,20 Ethernet1/11 10 Eth10-ASIC0 Ext 40000 +Ethernet44 21,22,23,24 Ethernet1/12 11 Eth11-ASIC0 Ext 40000 +Ethernet48 53,54,55,56 Ethernet1/13 12 Eth12-ASIC0 Ext 40000 +Ethernet52 49,50,51,52 Ethernet1/14 13 Eth13-ASIC0 Ext 40000 +Ethernet56 57,58,59,60 Ethernet1/15 14 Eth14-ASIC0 Ext 40000 +Ethernet60 61,62,63,64 Ethernet1/16 15 Eth15-ASIC0 Ext 40000 +Ethernet-BP0 69,70,71,72 Eth16-ASIC0 0 Eth16-ASIC0 Int 40000 +Ethernet-BP4 65,66,67,68 Eth17-ASIC0 1 Eth17-ASIC0 Int 40000 +Ethernet-BP8 73,74,75,76 Eth18-ASIC0 2 Eth18-ASIC0 Int 40000 +Ethernet-BP12 77,78,79,80 Eth19-ASIC0 3 Eth19-ASIC0 Int 40000 +Ethernet-BP16 109,110,111,112 Eth20-ASIC0 4 Eth20-ASIC0 Int 40000 +Ethernet-BP20 105,106,107,108 Eth21-ASIC0 5 Eth21-ASIC0 Int 40000 +Ethernet-BP24 113,114,115,116 Eth22-ASIC0 6 Eth22-ASIC0 Int 40000 +Ethernet-BP28 117,118,119,120 Eth23-ASIC0 7 Eth23-ASIC0 Int 40000 +Ethernet-BP32 125,126,127,128 Eth24-ASIC0 8 Eth24-ASIC0 Int 40000 +Ethernet-BP36 121,122,123,124 Eth25-ASIC0 9 Eth25-ASIC0 Int 40000 +Ethernet-BP40 81,82,83,84 Eth26-ASIC0 10 Eth26-ASIC0 Int 40000 +Ethernet-BP44 85,86,87,88 Eth27-ASIC0 11 Eth27-ASIC0 Int 40000 +Ethernet-BP48 93,94,95,96 Eth28-ASIC0 12 Eth28-ASIC0 Int 40000 +Ethernet-BP52 89,90,91,92 Eth29-ASIC0 13 Eth29-ASIC0 Int 40000 +Ethernet-BP56 101,102,103,104 Eth30-ASIC0 14 Eth30-ASIC0 Int 40000 +Ethernet-BP60 97,98,99,100 Eth31-ASIC0 15 Eth31-ASIC0 Int 40000 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/td2-s6000-32x40G.config.bcm index 4c94db7107c..0e25b4d4232 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/td2-s6000-32x40G.config.bcm +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/0/td2-s6000-32x40G.config.bcm @@ -20,7 +20,7 @@ parity_enable=1 stat_if_parity_enable=0 # -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/port_config.ini index 95cf5eec9e4..61d38693526 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/port_config.ini +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/port_config.ini @@ -1,33 +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 +# name lanes alias index asic_port_name role speed +Ethernet64 25,26,27,28 Ethernet1/17 16 Eth0-ASIC1 Ext 40000 +Ethernet68 29,30,31,32 Ethernet1/18 17 Eth1-ASIC1 Ext 40000 +Ethernet72 33,34,35,36 Ethernet1/19 18 Eth2-ASIC1 Ext 40000 +Ethernet76 37,38,39,40 Ethernet1/20 19 Eth3-ASIC1 Ext 40000 +Ethernet80 45,46,47,48 Ethernet1/21 20 Eth4-ASIC1 Ext 40000 +Ethernet84 41,42,43,44 Ethernet1/22 21 Eth5-ASIC1 Ext 40000 +Ethernet88 1,2,3,4 Ethernet1/23 22 Eth6-ASIC1 Ext 40000 +Ethernet92 5,6,7,8 Ethernet1/24 23 Eth7-ASIC1 Ext 40000 +Ethernet96 13,14,15,16 Ethernet1/25 24 Eth8-ASIC1 Ext 40000 +Ethernet100 9,10,11,12 Ethernet1/26 25 Eth9-ASIC1 Ext 40000 +Ethernet104 17,18,19,20 Ethernet1/27 26 Eth10-ASIC1 Ext 40000 +Ethernet108 21,22,23,24 Ethernet1/28 27 Eth11-ASIC1 Ext 40000 +Ethernet112 53,54,55,56 Ethernet1/29 28 Eth12-ASIC1 Ext 40000 +Ethernet116 49,50,51,52 Ethernet1/30 29 Eth13-ASIC1 Ext 40000 +Ethernet120 57,58,59,60 Ethernet1/31 30 Eth14-ASIC1 Ext 40000 +Ethernet124 61,62,63,64 Ethernet1/32 31 Eth15-ASIC1 Ext 40000 +Ethernet-BP64 69,70,71,72 Eth16-ASIC1 16 Eth16-ASIC1 Int 40000 +Ethernet-BP68 65,66,67,68 Eth17-ASIC1 17 Eth17-ASIC1 Int 40000 +Ethernet-BP72 73,74,75,76 Eth18-ASIC1 18 Eth18-ASIC1 Int 40000 +Ethernet-BP76 77,78,79,80 Eth19-ASIC1 19 Eth19-ASIC1 Int 40000 +Ethernet-BP80 109,110,111,112 Eth20-ASIC1 20 Eth20-ASIC1 Int 40000 +Ethernet-BP84 105,106,107,108 Eth21-ASIC1 21 Eth21-ASIC1 Int 40000 +Ethernet-BP88 113,114,115,116 Eth22-ASIC1 22 Eth22-ASIC1 Int 40000 +Ethernet-BP92 117,118,119,120 Eth23-ASIC1 23 Eth23-ASIC1 Int 40000 +Ethernet-BP96 125,126,127,128 Eth24-ASIC1 24 Eth24-ASIC1 Int 40000 +Ethernet-BP100 121,122,123,124 Eth25-ASIC1 25 Eth25-ASIC1 Int 40000 +Ethernet-BP104 81,82,83,84 Eth26-ASIC1 26 Eth26-ASIC1 Int 40000 +Ethernet-BP108 85,86,87,88 Eth27-ASIC1 27 Eth27-ASIC1 Int 40000 +Ethernet-BP112 93,94,95,96 Eth28-ASIC1 28 Eth28-ASIC1 Int 40000 +Ethernet-BP116 89,90,91,92 Eth29-ASIC1 29 Eth29-ASIC1 Int 40000 +Ethernet-BP120 101,102,103,104 Eth30-ASIC1 30 Eth30-ASIC1 Int 40000 +Ethernet-BP124 97,98,99,100 Eth31-ASIC1 31 Eth31-ASIC1 Int 40000 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/td2-s6000-32x40G.config.bcm index 4c94db7107c..0e25b4d4232 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/td2-s6000-32x40G.config.bcm +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/1/td2-s6000-32x40G.config.bcm @@ -20,7 +20,7 @@ parity_enable=1 stat_if_parity_enable=0 # -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/port_config.ini index 95cf5eec9e4..af8a37f0954 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/port_config.ini +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/port_config.ini @@ -1,33 +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 +# name lanes alias index asic_port_name role speed +Ethernet128 25,26,27,28 Ethernet1/33 32 Eth0-ASIC2 Ext 40000 +Ethernet132 29,30,31,32 Ethernet1/34 33 Eth1-ASIC2 Ext 40000 +Ethernet136 33,34,35,36 Ethernet1/35 34 Eth2-ASIC2 Ext 40000 +Ethernet140 37,38,39,40 Ethernet1/36 35 Eth3-ASIC2 Ext 40000 +Ethernet144 45,46,47,48 Ethernet1/37 36 Eth4-ASIC2 Ext 40000 +Ethernet148 41,42,43,44 Ethernet1/38 37 Eth5-ASIC2 Ext 40000 +Ethernet152 1,2,3,4 Ethernet1/39 38 Eth6-ASIC2 Ext 40000 +Ethernet156 5,6,7,8 Ethernet1/40 39 Eth7-ASIC2 Ext 40000 +Ethernet160 13,14,15,16 Ethernet1/41 40 Eth8-ASIC2 Ext 40000 +Ethernet164 9,10,11,12 Ethernet1/42 41 Eth9-ASIC2 Ext 40000 +Ethernet168 17,18,19,20 Ethernet1/43 42 Eth10-ASIC2 Ext 40000 +Ethernet172 21,22,23,24 Ethernet1/44 43 Eth11-ASIC2 Ext 40000 +Ethernet176 53,54,55,56 Ethernet1/45 44 Eth12-ASIC2 Ext 40000 +Ethernet180 49,50,51,52 Ethernet1/46 45 Eth13-ASIC2 Ext 40000 +Ethernet184 57,58,59,60 Ethernet1/47 46 Eth14-ASIC2 Ext 40000 +Ethernet188 61,62,63,64 Ethernet1/48 47 Eth15-ASIC2 Ext 40000 +Ethernet-BP128 69,70,71,72 Eth16-ASIC2 32 Eth16-ASIC2 Int 40000 +Ethernet-BP132 65,66,67,68 Eth17-ASIC2 33 Eth17-ASIC2 Int 40000 +Ethernet-BP136 73,74,75,76 Eth18-ASIC2 34 Eth18-ASIC2 Int 40000 +Ethernet-BP140 77,78,79,80 Eth19-ASIC2 35 Eth19-ASIC2 Int 40000 +Ethernet-BP144 109,110,111,112 Eth20-ASIC2 36 Eth20-ASIC2 Int 40000 +Ethernet-BP148 105,106,107,108 Eth21-ASIC2 37 Eth21-ASIC2 Int 40000 +Ethernet-BP152 113,114,115,116 Eth22-ASIC2 38 Eth22-ASIC2 Int 40000 +Ethernet-BP156 117,118,119,120 Eth23-ASIC2 39 Eth23-ASIC2 Int 40000 +Ethernet-BP160 125,126,127,128 Eth24-ASIC2 40 Eth24-ASIC2 Int 40000 +Ethernet-BP164 121,122,123,124 Eth25-ASIC2 41 Eth25-ASIC2 Int 40000 +Ethernet-BP168 81,82,83,84 Eth26-ASIC2 42 Eth26-ASIC2 Int 40000 +Ethernet-BP172 85,86,87,88 Eth27-ASIC2 43 Eth27-ASIC2 Int 40000 +Ethernet-BP176 93,94,95,96 Eth28-ASIC2 44 Eth28-ASIC2 Int 40000 +Ethernet-BP180 89,90,91,92 Eth29-ASIC2 45 Eth29-ASIC2 Int 40000 +Ethernet-BP184 101,102,103,104 Eth30-ASIC2 46 Eth30-ASIC2 Int 40000 +Ethernet-BP188 97,98,99,100 Eth31-ASIC2 47 Eth31-ASIC2 Int 40000 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/td2-s6000-32x40G.config.bcm index 4c94db7107c..0e25b4d4232 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/td2-s6000-32x40G.config.bcm +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/2/td2-s6000-32x40G.config.bcm @@ -20,7 +20,7 @@ parity_enable=1 stat_if_parity_enable=0 # -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/port_config.ini index 95cf5eec9e4..6e10b45cbc4 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/port_config.ini +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/port_config.ini @@ -1,33 +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 +# name lanes alias index asic_port_name role speed +Ethernet192 25,26,27,28 Ethernet1/49 48 Eth0-ASIC3 Ext 40000 +Ethernet196 29,30,31,32 Ethernet1/50 49 Eth1-ASIC3 Ext 40000 +Ethernet200 33,34,35,36 Ethernet1/51 50 Eth2-ASIC3 Ext 40000 +Ethernet204 37,38,39,40 Ethernet1/52 51 Eth3-ASIC3 Ext 40000 +Ethernet208 45,46,47,48 Ethernet1/53 52 Eth4-ASIC3 Ext 40000 +Ethernet212 41,42,43,44 Ethernet1/54 53 Eth5-ASIC3 Ext 40000 +Ethernet216 1,2,3,4 Ethernet1/55 54 Eth6-ASIC3 Ext 40000 +Ethernet220 5,6,7,8 Ethernet1/56 55 Eth7-ASIC3 Ext 40000 +Ethernet224 13,14,15,16 Ethernet1/57 56 Eth8-ASIC3 Ext 40000 +Ethernet228 9,10,11,12 Ethernet1/58 57 Eth9-ASIC3 Ext 40000 +Ethernet232 17,18,19,20 Ethernet1/59 58 Eth10-ASIC3 Ext 40000 +Ethernet236 21,22,23,24 Ethernet1/60 59 Eth11-ASIC3 Ext 40000 +Ethernet240 53,54,55,56 Ethernet1/61 60 Eth12-ASIC3 Ext 40000 +Ethernet244 49,50,51,52 Ethernet1/62 61 Eth13-ASIC3 Ext 40000 +Ethernet248 57,58,59,60 Ethernet1/63 62 Eth14-ASIC3 Ext 40000 +Ethernet252 61,62,63,64 Ethernet1/64 63 Eth15-ASIC3 Ext 40000 +Ethernet-BP192 69,70,71,72 Eth16-ASIC3 48 Eth16-ASIC3 Int 40000 +Ethernet-BP196 65,66,67,68 Eth17-ASIC3 49 Eth17-ASIC3 Int 40000 +Ethernet-BP200 73,74,75,76 Eth18-ASIC3 50 Eth18-ASIC3 Int 40000 +Ethernet-BP204 77,78,79,80 Eth19-ASIC3 51 Eth19-ASIC3 Int 40000 +Ethernet-BP208 109,110,111,112 Eth20-ASIC3 52 Eth20-ASIC3 Int 40000 +Ethernet-BP212 105,106,107,108 Eth21-ASIC3 53 Eth21-ASIC3 Int 40000 +Ethernet-BP216 113,114,115,116 Eth22-ASIC3 54 Eth22-ASIC3 Int 40000 +Ethernet-BP220 117,118,119,120 Eth23-ASIC3 55 Eth23-ASIC3 Int 40000 +Ethernet-BP224 125,126,127,128 Eth24-ASIC3 56 Eth24-ASIC3 Int 40000 +Ethernet-BP228 121,122,123,124 Eth25-ASIC3 57 Eth25-ASIC3 Int 40000 +Ethernet-BP232 81,82,83,84 Eth26-ASIC3 58 Eth26-ASIC3 Int 40000 +Ethernet-BP236 85,86,87,88 Eth27-ASIC3 59 Eth27-ASIC3 Int 40000 +Ethernet-BP240 93,94,95,96 Eth28-ASIC3 60 Eth28-ASIC3 Int 40000 +Ethernet-BP244 89,90,91,92 Eth29-ASIC3 61 Eth29-ASIC3 Int 40000 +Ethernet-BP248 101,102,103,104 Eth30-ASIC3 62 Eth30-ASIC3 Int 40000 +Ethernet-BP252 97,98,99,100 Eth31-ASIC3 63 Eth31-ASIC3 Int 40000 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/td2-s6000-32x40G.config.bcm index 4c94db7107c..0e25b4d4232 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/td2-s6000-32x40G.config.bcm +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/3/td2-s6000-32x40G.config.bcm @@ -20,7 +20,7 @@ parity_enable=1 stat_if_parity_enable=0 # -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/port_config.ini index 95cf5eec9e4..f6b9ccf3da9 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/port_config.ini +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/port_config.ini @@ -1,33 +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 +# name lanes alias index asic_port_name role speed +Ethernet-BP256 25,26,27,28 Eth0-ASIC4 64 Eth0-ASIC4 Int 40000 +Ethernet-BP260 29,30,31,32 Eth1-ASIC4 65 Eth1-ASIC4 Int 40000 +Ethernet-BP264 33,34,35,36 Eth2-ASIC4 66 Eth2-ASIC4 Int 40000 +Ethernet-BP268 37,38,39,40 Eth3-ASIC4 67 Eth3-ASIC4 Int 40000 +Ethernet-BP272 45,46,47,48 Eth4-ASIC4 68 Eth4-ASIC4 Int 40000 +Ethernet-BP276 41,42,43,44 Eth5-ASIC4 69 Eth5-ASIC4 Int 40000 +Ethernet-BP280 1,2,3,4 Eth6-ASIC4 70 Eth6-ASIC4 Int 40000 +Ethernet-BP284 5,6,7,8 Eth7-ASIC4 71 Eth7-ASIC4 Int 40000 +Ethernet-BP288 13,14,15,16 Eth8-ASIC4 72 Eth8-ASIC4 Int 40000 +Ethernet-BP292 9,10,11,12 Eth9-ASIC4 73 Eth9-ASIC4 Int 40000 +Ethernet-BP296 17,18,19,20 Eth10-ASIC4 74 Eth10-ASIC4 Int 40000 +Ethernet-BP300 21,22,23,24 Eth11-ASIC4 75 Eth11-ASIC4 Int 40000 +Ethernet-BP304 53,54,55,56 Eth12-ASIC4 76 Eth12-ASIC4 Int 40000 +Ethernet-BP308 49,50,51,52 Eth13-ASIC4 77 Eth13-ASIC4 Int 40000 +Ethernet-BP312 57,58,59,60 Eth14-ASIC4 78 Eth14-ASIC4 Int 40000 +Ethernet-BP316 61,62,63,64 Eth15-ASIC4 79 Eth15-ASIC4 Int 40000 +Ethernet-BP320 69,70,71,72 Eth16-ASIC4 80 Eth16-ASIC4 Int 40000 +Ethernet-BP324 65,66,67,68 Eth17-ASIC4 81 Eth17-ASIC4 Int 40000 +Ethernet-BP328 73,74,75,76 Eth18-ASIC4 82 Eth18-ASIC4 Int 40000 +Ethernet-BP332 77,78,79,80 Eth19-ASIC4 83 Eth19-ASIC4 Int 40000 +Ethernet-BP336 109,110,111,112 Eth20-ASIC4 84 Eth20-ASIC4 Int 40000 +Ethernet-BP340 105,106,107,108 Eth21-ASIC4 85 Eth21-ASIC4 Int 40000 +Ethernet-BP344 113,114,115,116 Eth22-ASIC4 86 Eth22-ASIC4 Int 40000 +Ethernet-BP348 117,118,119,120 Eth23-ASIC4 87 Eth23-ASIC4 Int 40000 +Ethernet-BP352 125,126,127,128 Eth24-ASIC4 88 Eth24-ASIC4 Int 40000 +Ethernet-BP356 121,122,123,124 Eth25-ASIC4 89 Eth25-ASIC4 Int 40000 +Ethernet-BP360 81,82,83,84 Eth26-ASIC4 90 Eth26-ASIC4 Int 40000 +Ethernet-BP364 85,86,87,88 Eth27-ASIC4 91 Eth27-ASIC4 Int 40000 +Ethernet-BP368 93,94,95,96 Eth28-ASIC4 92 Eth28-ASIC4 Int 40000 +Ethernet-BP372 89,90,91,92 Eth29-ASIC4 93 Eth29-ASIC4 Int 40000 +Ethernet-BP376 101,102,103,104 Eth30-ASIC4 94 Eth30-ASIC4 Int 40000 +Ethernet-BP380 97,98,99,100 Eth31-ASIC4 95 Eth31-ASIC4 Int 40000 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/td2-s6000-32x40G.config.bcm index 4c94db7107c..0e25b4d4232 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/td2-s6000-32x40G.config.bcm +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/4/td2-s6000-32x40G.config.bcm @@ -20,7 +20,7 @@ parity_enable=1 stat_if_parity_enable=0 # -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/port_config.ini b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/port_config.ini index 95cf5eec9e4..96e863b8734 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/port_config.ini +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/port_config.ini @@ -1,33 +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 +# name lanes alias index asic_port_name role speed +Ethernet-BP384 25,26,27,28 Eth0-ASIC5 96 Eth0-ASIC5 Int 40000 +Ethernet-BP388 29,30,31,32 Eth1-ASIC5 97 Eth1-ASIC5 Int 40000 +Ethernet-BP392 33,34,35,36 Eth2-ASIC5 98 Eth2-ASIC5 Int 40000 +Ethernet-BP396 37,38,39,40 Eth3-ASIC5 99 Eth3-ASIC5 Int 40000 +Ethernet-BP400 45,46,47,48 Eth4-ASIC5 100 Eth4-ASIC5 Int 40000 +Ethernet-BP404 41,42,43,44 Eth5-ASIC5 101 Eth5-ASIC5 Int 40000 +Ethernet-BP408 1,2,3,4 Eth6-ASIC5 102 Eth6-ASIC5 Int 40000 +Ethernet-BP412 5,6,7,8 Eth7-ASIC5 103 Eth7-ASIC5 Int 40000 +Ethernet-BP416 13,14,15,16 Eth8-ASIC5 104 Eth8-ASIC5 Int 40000 +Ethernet-BP420 9,10,11,12 Eth9-ASIC5 105 Eth9-ASIC5 Int 40000 +Ethernet-BP424 17,18,19,20 Eth10-ASIC5 106 Eth10-ASIC5 Int 40000 +Ethernet-BP428 21,22,23,24 Eth11-ASIC5 107 Eth11-ASIC5 Int 40000 +Ethernet-BP432 53,54,55,56 Eth12-ASIC5 108 Eth12-ASIC5 Int 40000 +Ethernet-BP436 49,50,51,52 Eth13-ASIC5 109 Eth13-ASIC5 Int 40000 +Ethernet-BP440 57,58,59,60 Eth14-ASIC5 110 Eth14-ASIC5 Int 40000 +Ethernet-BP444 61,62,63,64 Eth15-ASIC5 111 Eth15-ASIC5 Int 40000 +Ethernet-BP448 69,70,71,72 Eth16-ASIC5 112 Eth16-ASIC5 Int 40000 +Ethernet-BP452 65,66,67,68 Eth17-ASIC5 113 Eth17-ASIC5 Int 40000 +Ethernet-BP456 73,74,75,76 Eth18-ASIC5 114 Eth18-ASIC5 Int 40000 +Ethernet-BP460 77,78,79,80 Eth19-ASIC5 115 Eth19-ASIC5 Int 40000 +Ethernet-BP464 109,110,111,112 Eth20-ASIC5 116 Eth20-ASIC5 Int 40000 +Ethernet-BP468 105,106,107,108 Eth21-ASIC5 117 Eth21-ASIC5 Int 40000 +Ethernet-BP472 113,114,115,116 Eth22-ASIC5 118 Eth22-ASIC5 Int 40000 +Ethernet-BP476 117,118,119,120 Eth23-ASIC5 119 Eth23-ASIC5 Int 40000 +Ethernet-BP480 125,126,127,128 Eth24-ASIC5 120 Eth24-ASIC5 Int 40000 +Ethernet-BP484 121,122,123,124 Eth25-ASIC5 121 Eth25-ASIC5 Int 40000 +Ethernet-BP488 81,82,83,84 Eth26-ASIC5 122 Eth26-ASIC5 Int 40000 +Ethernet-BP492 85,86,87,88 Eth27-ASIC5 123 Eth27-ASIC5 Int 40000 +Ethernet-BP496 93,94,95,96 Eth28-ASIC5 124 Eth28-ASIC5 Int 40000 +Ethernet-BP500 89,90,91,92 Eth29-ASIC5 125 Eth29-ASIC5 Int 40000 +Ethernet-BP504 101,102,103,104 Eth30-ASIC5 126 Eth30-ASIC5 Int 40000 +Ethernet-BP508 97,98,99,100 Eth31-ASIC5 127 Eth31-ASIC5 Int 40000 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/td2-s6000-32x40G.config.bcm b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/td2-s6000-32x40G.config.bcm index 4c94db7107c..0e25b4d4232 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/td2-s6000-32x40G.config.bcm +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/5/td2-s6000-32x40G.config.bcm @@ -20,7 +20,7 @@ parity_enable=1 stat_if_parity_enable=0 # -bcm_num_cos=8 +bcm_num_cos=10 bcm_stat_interval=2000000 l2xmsg_hostbuf_size=8192 l2xmsg_mode=1 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/topology.sh b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/topology.sh index cf70f306318..c4140ededb2 100755 --- a/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/topology.sh +++ b/device/virtual/x86_64-kvm_x86_64-r0/msft_multi_asic_vs/topology.sh @@ -8,10 +8,10 @@ NUM_INTERFACES_PER_ASIC=32 start () { # Move external links into assigned frontend namespaces - # eth0 - eth15: asic2 - # eth16 - eth31: asic3 - # eth32 - eth47: asic4 - # eth48 - eth63: asic5 + # eth1 - eth16: asic0 + # eth17 - eth32: asic1 + # eth33 - eth48: asic2 + # eth49 - eth64: asic3 for ASIC in `seq $FIRST_FRONTEND_ASIC $LAST_FRONTEND_ASIC`; do for NUM in `seq 1 16`; do ORIG="eth$((16 * $ASIC + $NUM))" @@ -22,6 +22,7 @@ start () { ip link set dev $ORIG name $TEMP # rename to prevent conflicts before renaming in new namespace ip link set dev $TEMP netns asic$ASIC sudo ip netns exec asic$ASIC ip link set $TEMP name $NEW # rename to final interface name + sudo ip netns exec asic$ASIC ip link set dev $NEW mtu 9100 sudo ip netns exec asic$ASIC ip link set $NEW up done done @@ -43,7 +44,9 @@ start () { sudo ip netns exec asic$BACKEND ip link set $TEMP_BACK name $BACK_NAME sudo ip netns exec asic$FRONTEND ip link set $TEMP_FRONT name $FRONT_NAME + sudo ip netns exec asic$BACKEND ip link set dev $BACK_NAME mtu 9100 sudo ip netns exec asic$BACKEND ip link set $BACK_NAME up + sudo ip netns exec asic$FRONTEND ip link set dev $FRONT_NAME mtu 9100 sudo ip netns exec asic$FRONTEND ip link set $FRONT_NAME up done done @@ -54,8 +57,8 @@ stop() { for ASIC in `seq $FIRST_FRONTEND_ASIC $LAST_FRONTEND_ASIC`; do for NUM in `seq 1 16`; do TEMP="eth999" - OLD="eth$((16 * $ASIC + $NUM))" - NAME="eth$((16 * $ASIC + $NUM - 1))" + OLD="eth$(($NUM))" + NAME="eth$((16 * $ASIC + $NUM))" sudo ip netns exec asic$ASIC ip link set dev $OLD down sudo ip netns exec asic$ASIC ip link set dev $OLD name $TEMP sudo ip netns exec asic$ASIC ip link set dev $TEMP netns 1 diff --git a/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json b/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json index 6901164952a..c6a21eb19fc 100644 --- a/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json +++ b/device/virtual/x86_64-kvm_x86_64-r0/pmon_daemon_control.json @@ -2,5 +2,6 @@ "skip_ledd": true, "skip_xcvrd": true, "skip_psud": true, - "skip_syseepromd": true + "skip_syseepromd": true, + "skip_thermalctld": true } diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv new file mode 100644 index 00000000000..b9f4e750a8d --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv @@ -0,0 +1,342 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_1M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G ,PAM4,,,,,,,ANLT 25G/100G ,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv new file mode 100644 index 00000000000..b6bbd017e48 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv @@ -0,0 +1,342 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_3M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G,PAM4,,,,,,,ANLT 25G/100G,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv new file mode 100644 index 00000000000..758ee731733 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv @@ -0,0 +1,289 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,OPTICS,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,,SPEED,ENCODING,,,,,, +,,,50G/400G,PAM4,,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,,10G/40G,NRZ,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING +0,0,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +1,0,1,0,4,-1,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +2,0,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +3,0,3,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +4,0,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +5,0,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +6,0,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +7,0,7,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +8,1,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +9,1,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +10,1,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +11,1,3,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +12,1,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +13,1,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +14,1,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +15,1,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +16,2,0,0,4,0,0,0,6,Medium,High,0,2,0,0,2,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +17,2,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +18,2,2,0,4,0,0,0,6,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +19,2,3,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +20,2,4,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +21,2,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +22,2,6,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +23,2,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +24,3,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +25,3,1,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +26,3,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +27,3,3,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +28,3,4,0,4,-1,0,0,5.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +29,3,5,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +30,3,6,0,2,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +31,3,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +32,4,0,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,1,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +33,4,1,0,2,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +34,4,2,0,4,0,0,2,4,Medium,High,0,2,0,0,2,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +35,4,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +36,4,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +37,4,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +38,4,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +39,4,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +40,5,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +41,5,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +42,5,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +43,5,3,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +44,5,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +45,5,5,0,2,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +46,5,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +47,5,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +48,6,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +49,6,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +50,6,2,0,4,0,0,2,4,Medium,High,0,2,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +51,6,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +52,6,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +53,6,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +54,6,6,0,2,0,0,2,5.5,Medium,High,0,2,0,0,2,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +55,6,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +56,7,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +57,7,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +58,7,2,0,4,-1,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +59,7,3,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +60,7,4,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +61,7,5,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +62,7,6,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +63,7,7,0,4,0,0,4,4,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +64,8,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +65,8,1,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +66,8,2,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +67,8,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +68,8,4,0,4,0,0,4,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +69,8,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +70,8,6,0,2,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +71,8,7,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +72,9,0,0,4,0,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +73,9,1,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +74,9,2,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +75,9,3,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +76,9,4,0,4,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +77,9,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +78,9,6,0,4,0,0,2,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +79,9,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +80,10,0,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +81,10,1,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +82,10,2,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +83,10,3,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +84,10,4,0,4,-1,0,4,6,Medium,High,0,2,0,0,4,0,0,4,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +85,10,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +86,10,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +87,10,7,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +88,11,0,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +89,11,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +90,11,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +91,11,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +92,11,4,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +93,11,5,0,4,0,0,2,7,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +94,11,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +95,11,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +96,12,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +97,12,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +98,12,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +99,12,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +100,12,4,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +101,12,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +102,12,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +103,12,7,0,4,0,0,0,5.5,Medium,High,0,2,0,1,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +104,13,0,0,2,0,0,4,4.5,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +105,13,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +106,13,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +107,13,3,0,2,0,0,2,4.5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +108,13,4,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +109,13,5,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,1,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +110,13,6,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +111,13,7,0,4,-1,0,0,5,Medium,High,0,2,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +112,14,0,0,4,0,0,0,5,Medium,High,0,2,0,0,2,0,0,2,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +113,14,1,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +114,14,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +115,14,3,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +116,14,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +117,14,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +118,14,6,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +119,14,7,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +120,15,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +121,15,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +122,15,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +123,15,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +124,15,4,0,4,-1,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +125,15,5,0,4,0,0,0,5,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +126,15,6,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +127,15,7,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +128,16,0,0,2,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +129,16,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +130,16,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +131,16,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +132,16,4,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +133,16,5,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +134,16,6,0,4,0,0,0,6.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +135,16,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +136,17,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +137,17,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +138,17,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +139,17,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +140,17,4,1,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +141,17,5,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +142,17,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +143,17,7,0,4,0,0,2,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +144,18,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +145,18,1,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +146,18,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +147,18,3,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +148,18,4,0,2,0,0,0,7,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +149,18,5,0,2,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +150,18,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +151,18,7,0,4,0,0,4,4,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +152,19,0,0,2,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +153,19,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +154,19,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +155,19,3,0,4,0,0,-2,6,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +156,19,4,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +157,19,5,0,4,0,0,0,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +158,19,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +159,19,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +160,20,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +161,20,1,0,2,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +162,20,2,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +163,20,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +164,20,4,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +165,20,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +166,20,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +167,20,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +168,21,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +169,21,1,0,4,-1,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +170,21,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +171,21,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +172,21,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +173,21,5,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +174,21,6,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +175,21,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +176,22,0,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +177,22,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +178,22,2,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +179,22,3,0,4,-1,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +180,22,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +181,22,5,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +182,22,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +183,22,7,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +184,23,0,0,2,0,0,2,6,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +185,23,1,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +186,23,2,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +187,23,3,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +188,23,4,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +189,23,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +190,23,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +191,23,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +192,24,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +193,24,1,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +194,24,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +195,24,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +196,24,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +197,24,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +198,24,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +199,24,7,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +200,25,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +201,25,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +202,25,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +203,25,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +204,25,4,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +205,25,5,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +206,25,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +207,25,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +208,26,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,-1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +209,26,1,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +210,26,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +211,26,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +212,26,4,0,2,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +213,26,5,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +214,26,6,0,4,0,0,4,3.5,Medium,High,0,2,0,0,2,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +215,26,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +216,27,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +217,27,1,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +218,27,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +219,27,3,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +220,27,4,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +221,27,5,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +222,27,6,0,2,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +223,27,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +224,28,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +225,28,1,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +226,28,2,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +227,28,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +228,28,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +229,28,5,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +230,28,6,0,2,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +231,28,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +232,29,0,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +233,29,1,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +234,29,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +235,29,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +236,29,4,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +237,29,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +238,29,6,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +239,29,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +240,30,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +241,30,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +242,30,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +243,30,3,0,2,0,0,2,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +244,30,4,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +245,30,5,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +246,30,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +247,30,7,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +248,31,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +249,31,1,0,4,0,-1,2,5.5,Medium,High,0,2,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +250,31,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +251,31,3,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +252,31,4,0,4,-1,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +253,31,5,0,4,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +254,31,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +255,31,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml new file mode 100644 index 00000000000..23445c6dede --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A new file mode 100644 index 00000000000..84aa4198360 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml new file mode 100755 index 00000000000..0c1644ab7d7 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini new file mode 100644 index 00000000000..66220e66a89 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20,21,22,23,24 Eth25 400000 24 9126 rs +Ethernet200 25,26,27,28,29,30,31,32 Eth26 400000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml new file mode 100644 index 00000000000..2e019733c45 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,972 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "90" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "90" + type: "eth" + - fec: "KRFEC" + id: "91" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "91" + type: "eth" + - fec: "KRFEC" + id: "92" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "92" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:1" + serdes_group: "10" + speed: "25G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "82" + lanes: "1:1" + serdes_group: "10" + speed: "25G" + sysport: "82" + type: "eth" + - fec: "KRFEC" + id: "83" + lanes: "2:1" + serdes_group: "10" + speed: "25G" + sysport: "83" + type: "eth" + - fec: "KRFEC" + id: "84" + lanes: "3:1" + serdes_group: "10" + speed: "25G" + sysport: "84" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:1" + serdes_group: "9" + speed: "25G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "74" + lanes: "1:1" + serdes_group: "9" + speed: "25G" + sysport: "74" + type: "eth" + - fec: "KRFEC" + id: "75" + lanes: "2:1" + serdes_group: "9" + speed: "25G" + sysport: "75" + type: "eth" + - fec: "KRFEC" + id: "76" + lanes: "3:1" + serdes_group: "9" + speed: "25G" + sysport: "76" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:1" + serdes_group: "8" + speed: "25G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "66" + lanes: "1:1" + serdes_group: "8" + speed: "25G" + sysport: "66" + type: "eth" + - fec: "KRFEC" + id: "67" + lanes: "2:1" + serdes_group: "8" + speed: "25G" + sysport: "67" + type: "eth" + - fec: "KRFEC" + id: "68" + lanes: "3:1" + serdes_group: "8" + speed: "25G" + sysport: "68" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:1" + serdes_group: "7" + speed: "25G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "58" + lanes: "1:1" + serdes_group: "7" + speed: "25G" + sysport: "58" + type: "eth" + - fec: "KRFEC" + id: "59" + lanes: "2:1" + serdes_group: "7" + speed: "25G" + sysport: "59" + type: "eth" + - fec: "KRFEC" + id: "60" + lanes: "3:1" + serdes_group: "7" + speed: "25G" + sysport: "60" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:1" + serdes_group: "6" + speed: "25G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "50" + lanes: "1:1" + serdes_group: "6" + speed: "25G" + sysport: "50" + type: "eth" + - fec: "KRFEC" + id: "51" + lanes: "2:1" + serdes_group: "6" + speed: "25G" + sysport: "51" + type: "eth" + - fec: "KRFEC" + id: "52" + lanes: "3:1" + serdes_group: "6" + speed: "25G" + sysport: "52" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "42" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "42" + type: "eth" + - fec: "KRFEC" + id: "43" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "43" + type: "eth" + - fec: "KRFEC" + id: "44" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "44" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:1" + serdes_group: "4" + speed: "25G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "34" + lanes: "1:1" + serdes_group: "4" + speed: "25G" + sysport: "34" + type: "eth" + - fec: "KRFEC" + id: "35" + lanes: "2:1" + serdes_group: "4" + speed: "25G" + sysport: "35" + type: "eth" + - fec: "KRFEC" + id: "36" + lanes: "3:1" + serdes_group: "4" + speed: "25G" + sysport: "36" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:1" + serdes_group: "19" + speed: "25G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "154" + lanes: "1:1" + serdes_group: "19" + speed: "25G" + sysport: "154" + type: "eth" + - fec: "KRFEC" + id: "155" + lanes: "2:1" + serdes_group: "19" + speed: "25G" + sysport: "155" + type: "eth" + - fec: "KRFEC" + id: "156" + lanes: "3:1" + serdes_group: "19" + speed: "25G" + sysport: "156" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:1" + serdes_group: "18" + speed: "25G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "146" + lanes: "1:1" + serdes_group: "18" + speed: "25G" + sysport: "146" + type: "eth" + - fec: "KRFEC" + id: "147" + lanes: "2:1" + serdes_group: "18" + speed: "25G" + sysport: "147" + type: "eth" + - fec: "KRFEC" + id: "148" + lanes: "3:1" + serdes_group: "18" + speed: "25G" + sysport: "148" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:1" + serdes_group: "17" + speed: "25G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "138" + lanes: "1:1" + serdes_group: "17" + speed: "25G" + sysport: "138" + type: "eth" + - fec: "KRFEC" + id: "139" + lanes: "2:1" + serdes_group: "17" + speed: "25G" + sysport: "139" + type: "eth" + - fec: "KRFEC" + id: "140" + lanes: "3:1" + serdes_group: "17" + speed: "25G" + sysport: "140" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:1" + serdes_group: "16" + speed: "25G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "130" + lanes: "1:1" + serdes_group: "16" + speed: "25G" + sysport: "130" + type: "eth" + - fec: "KRFEC" + id: "131" + lanes: "2:1" + serdes_group: "16" + speed: "25G" + sysport: "131" + type: "eth" + - fec: "KRFEC" + id: "132" + lanes: "3:1" + serdes_group: "16" + speed: "25G" + sysport: "132" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:1" + serdes_group: "15" + speed: "25G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "122" + lanes: "1:1" + serdes_group: "15" + speed: "25G" + sysport: "122" + type: "eth" + - fec: "KRFEC" + id: "123" + lanes: "2:1" + serdes_group: "15" + speed: "25G" + sysport: "123" + type: "eth" + - fec: "KRFEC" + id: "124" + lanes: "3:1" + serdes_group: "15" + speed: "25G" + sysport: "124" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "114" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "114" + type: "eth" + - fec: "KRFEC" + id: "115" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "115" + type: "eth" + - fec: "KRFEC" + id: "116" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "116" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "106" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "106" + type: "eth" + - fec: "KRFEC" + id: "107" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "107" + type: "eth" + - fec: "KRFEC" + id: "108" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "108" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:1" + serdes_group: "12" + speed: "25G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "98" + lanes: "1:1" + serdes_group: "12" + speed: "25G" + sysport: "98" + type: "eth" + - fec: "KRFEC" + id: "99" + lanes: "2:1" + serdes_group: "12" + speed: "25G" + sysport: "99" + type: "eth" + - fec: "KRFEC" + id: "100" + lanes: "3:1" + serdes_group: "12" + speed: "25G" + sysport: "100" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:1" + serdes_group: "26" + speed: "25G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "210" + lanes: "1:1" + serdes_group: "26" + speed: "25G" + sysport: "210" + type: "eth" + - fec: "KRFEC" + id: "211" + lanes: "2:1" + serdes_group: "26" + speed: "25G" + sysport: "211" + type: "eth" + - fec: "KRFEC" + id: "212" + lanes: "3:1" + serdes_group: "26" + speed: "25G" + sysport: "212" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:1" + serdes_group: "27" + speed: "25G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "218" + lanes: "1:1" + serdes_group: "27" + speed: "25G" + sysport: "218" + type: "eth" + - fec: "KRFEC" + id: "219" + lanes: "2:1" + serdes_group: "27" + speed: "25G" + sysport: "219" + type: "eth" + - fec: "KRFEC" + id: "220" + lanes: "3:1" + serdes_group: "27" + speed: "25G" + sysport: "220" + type: "eth" + - fec: "NONE" + id: "193" + lanes: "0:1" + serdes_group: "24" + speed: "10G" + sysport: "193" + type: "eth" + - fec: "NONE" + id: "194" + lanes: "1:1" + serdes_group: "24" + speed: "10G" + sysport: "194" + type: "eth" + - fec: "NONE" + id: "195" + lanes: "2:1" + serdes_group: "24" + speed: "10G" + sysport: "195" + type: "eth" + - fec: "NONE" + id: "196" + lanes: "3:1" + serdes_group: "24" + speed: "10G" + sysport: "196" + type: "eth" + - fec: "NONE" + id: "201" + lanes: "0:1" + serdes_group: "25" + speed: "10G" + sysport: "201" + type: "eth" + - fec: "NONE" + id: "202" + lanes: "1:1" + serdes_group: "25" + speed: "10G" + sysport: "202" + type: "eth" + - fec: "NONE" + id: "203" + lanes: "2:1" + serdes_group: "25" + speed: "10G" + sysport: "203" + type: "eth" + - fec: "NONE" + id: "204" + lanes: "3:1" + serdes_group: "25" + speed: "10G" + sysport: "204" + type: "eth" + - fec: "NONE" + id: "177" + lanes: "0:1" + serdes_group: "22" + speed: "10G" + sysport: "177" + type: "eth" + - fec: "NONE" + id: "178" + lanes: "1:1" + serdes_group: "22" + speed: "10G" + sysport: "178" + type: "eth" + - fec: "NONE" + id: "179" + lanes: "2:1" + serdes_group: "22" + speed: "10G" + sysport: "179" + type: "eth" + - fec: "NONE" + id: "180" + lanes: "3:1" + serdes_group: "22" + speed: "10G" + sysport: "180" + type: "eth" + - fec: "NONE" + id: "185" + lanes: "0:1" + serdes_group: "23" + speed: "10G" + sysport: "185" + type: "eth" + - fec: "NONE" + id: "186" + lanes: "1:1" + serdes_group: "23" + speed: "10G" + sysport: "186" + type: "eth" + - fec: "NONE" + id: "187" + lanes: "2:1" + serdes_group: "23" + speed: "10G" + sysport: "187" + type: "eth" + - fec: "NONE" + id: "188" + lanes: "3:1" + serdes_group: "23" + speed: "10G" + sysport: "188" + type: "eth" + - fec: "NONE" + id: "161" + lanes: "0:1" + serdes_group: "20" + speed: "10G" + sysport: "161" + type: "eth" + - fec: "NONE" + id: "162" + lanes: "1:1" + serdes_group: "20" + speed: "10G" + sysport: "162" + type: "eth" + - fec: "NONE" + id: "163" + lanes: "2:1" + serdes_group: "20" + speed: "10G" + sysport: "163" + type: "eth" + - fec: "NONE" + id: "164" + lanes: "3:1" + serdes_group: "20" + speed: "10G" + sysport: "164" + type: "eth" + - fec: "NONE" + id: "169" + lanes: "0:1" + serdes_group: "21" + speed: "10G" + sysport: "169" + type: "eth" + - fec: "NONE" + id: "170" + lanes: "1:1" + serdes_group: "21" + speed: "10G" + sysport: "170" + type: "eth" + - fec: "NONE" + id: "171" + lanes: "2:1" + serdes_group: "21" + speed: "10G" + sysport: "171" + type: "eth" + - fec: "NONE" + id: "172" + lanes: "3:1" + serdes_group: "21" + speed: "10G" + sysport: "172" + type: "eth" + - fec: "NONE" + id: "17" + lanes: "0:1" + serdes_group: "2" + speed: "10G" + sysport: "17" + type: "eth" + - fec: "NONE" + id: "18" + lanes: "1:1" + serdes_group: "2" + speed: "10G" + sysport: "18" + type: "eth" + - fec: "NONE" + id: "19" + lanes: "2:1" + serdes_group: "2" + speed: "10G" + sysport: "19" + type: "eth" + - fec: "NONE" + id: "20" + lanes: "3:1" + serdes_group: "2" + speed: "10G" + sysport: "20" + type: "eth" + - fec: "NONE" + id: "25" + lanes: "0:1" + serdes_group: "3" + speed: "10G" + sysport: "25" + type: "eth" + - fec: "NONE" + id: "26" + lanes: "1:1" + serdes_group: "3" + speed: "10G" + sysport: "26" + type: "eth" + - fec: "NONE" + id: "27" + lanes: "2:1" + serdes_group: "3" + speed: "10G" + sysport: "27" + type: "eth" + - fec: "NONE" + id: "28" + lanes: "3:1" + serdes_group: "3" + speed: "10G" + sysport: "28" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "NONE" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "NONE" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A new file mode 100644 index 00000000000..84aa4198360 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..5e5d2fe6686 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_104x1025G_6x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini new file mode 100644 index 00000000000..43e568f6ef3 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini @@ -0,0 +1,111 @@ +# name lanes alias speed index mtu fec +Ethernet0 89 Eth1-1 25000 0 9126 rs +Ethernet1 90 Eth1-2 25000 0 9126 rs +Ethernet2 91 Eth1-3 25000 0 9126 rs +Ethernet3 92 Eth1-4 25000 0 9126 rs +Ethernet8 81 Eth2-1 25000 1 9126 rs +Ethernet9 82 Eth2-2 25000 1 9126 rs +Ethernet10 83 Eth2-3 25000 1 9126 rs +Ethernet11 84 Eth2-4 25000 1 9126 rs +Ethernet16 73 Eth3-1 25000 2 9126 rs +Ethernet17 74 Eth3-2 25000 2 9126 rs +Ethernet18 75 Eth3-3 25000 2 9126 rs +Ethernet19 76 Eth3-4 25000 2 9126 rs +Ethernet24 65 Eth4-1 25000 3 9126 rs +Ethernet25 66 Eth4-2 25000 3 9126 rs +Ethernet26 67 Eth4-3 25000 3 9126 rs +Ethernet27 68 Eth4-4 25000 3 9126 rs +Ethernet32 57 Eth5-1 25000 4 9126 rs +Ethernet33 58 Eth5-2 25000 4 9126 rs +Ethernet34 59 Eth5-3 25000 4 9126 rs +Ethernet35 60 Eth5-4 25000 4 9126 rs +Ethernet40 49 Eth6-1 25000 5 9126 rs +Ethernet41 50 Eth6-2 25000 5 9126 rs +Ethernet42 51 Eth6-3 25000 5 9126 rs +Ethernet43 52 Eth6-4 25000 5 9126 rs +Ethernet48 41 Eth7-1 25000 6 9126 rs +Ethernet49 42 Eth7-2 25000 6 9126 rs +Ethernet50 43 Eth7-3 25000 6 9126 rs +Ethernet51 44 Eth7-4 25000 6 9126 rs +Ethernet56 33 Eth8-1 25000 7 9126 rs +Ethernet57 34 Eth8-2 25000 7 9126 rs +Ethernet58 35 Eth8-3 25000 7 9126 rs +Ethernet59 36 Eth8-4 25000 7 9126 rs +Ethernet64 153 Eth9-1 25000 8 9126 rs +Ethernet65 154 Eth9-2 25000 8 9126 rs +Ethernet66 155 Eth9-3 25000 8 9126 rs +Ethernet67 156 Eth9-4 25000 8 9126 rs +Ethernet72 145 Eth10-1 25000 9 9126 rs +Ethernet73 146 Eth10-2 25000 9 9126 rs +Ethernet74 147 Eth10-3 25000 9 9126 rs +Ethernet75 148 Eth10-4 25000 9 9126 rs +Ethernet80 137 Eth11-1 25000 10 9126 rs +Ethernet81 138 Eth11-2 25000 10 9126 rs +Ethernet82 139 Eth11-3 25000 10 9126 rs +Ethernet83 140 Eth11-4 25000 10 9126 rs +Ethernet88 129 Eth12-1 25000 11 9126 rs +Ethernet89 130 Eth12-2 25000 11 9126 rs +Ethernet90 131 Eth12-3 25000 11 9126 rs +Ethernet91 132 Eth12-4 25000 11 9126 rs +Ethernet96 121 Eth13-1 25000 12 9126 rs +Ethernet97 122 Eth13-2 25000 12 9126 rs +Ethernet98 123 Eth13-3 25000 12 9126 rs +Ethernet99 124 Eth13-4 25000 12 9126 rs +Ethernet104 113 Eth14-1 25000 13 9126 rs +Ethernet105 114 Eth14-2 25000 13 9126 rs +Ethernet106 115 Eth14-3 25000 13 9126 rs +Ethernet107 116 Eth14-4 25000 13 9126 rs +Ethernet112 105 Eth15-1 25000 14 9126 rs +Ethernet113 106 Eth15-2 25000 14 9126 rs +Ethernet114 107 Eth15-3 25000 14 9126 rs +Ethernet115 108 Eth15-4 25000 14 9126 rs +Ethernet120 97 Eth16-1 25000 15 9126 rs +Ethernet121 98 Eth16-2 25000 15 9126 rs +Ethernet122 99 Eth16-3 25000 15 9126 rs +Ethernet123 100 Eth16-4 25000 15 9126 rs +Ethernet128 209 Eth17-1 25000 16 9126 rs +Ethernet129 210 Eth17-2 25000 16 9126 rs +Ethernet130 211 Eth17-3 25000 16 9126 rs +Ethernet131 212 Eth17-4 25000 16 9126 rs +Ethernet136 217 Eth18-1 25000 17 9126 rs +Ethernet137 218 Eth18-2 25000 17 9126 rs +Ethernet138 219 Eth18-3 25000 17 9126 rs +Ethernet139 220 Eth18-4 25000 17 9126 rs +Ethernet144 193 Eth19-1 10000 18 9126 none +Ethernet145 194 Eth19-2 10000 18 9126 none +Ethernet146 195 Eth19-3 10000 18 9126 none +Ethernet147 196 Eth19-4 10000 18 9126 none +Ethernet152 201 Eth20-1 10000 19 9126 none +Ethernet153 202 Eth20-2 10000 19 9126 none +Ethernet154 203 Eth20-3 10000 19 9126 none +Ethernet155 204 Eth20-4 10000 19 9126 none +Ethernet160 177 Eth21-1 10000 20 9126 none +Ethernet161 178 Eth21-2 10000 20 9126 none +Ethernet162 179 Eth21-3 10000 20 9126 none +Ethernet163 180 Eth21-4 10000 20 9126 none +Ethernet168 185 Eth22-1 10000 21 9126 none +Ethernet169 186 Eth22-2 10000 21 9126 none +Ethernet170 187 Eth22-3 10000 21 9126 none +Ethernet171 188 Eth22-4 10000 21 9126 none +Ethernet176 161 Eth23-1 10000 22 9126 none +Ethernet177 162 Eth23-2 10000 22 9126 none +Ethernet178 163 Eth23-3 10000 22 9126 none +Ethernet179 164 Eth23-4 10000 22 9126 none +Ethernet184 169 Eth24-1 10000 23 9126 none +Ethernet185 170 Eth24-2 10000 23 9126 none +Ethernet186 171 Eth24-3 10000 23 9126 none +Ethernet187 172 Eth24-4 10000 23 9126 none +Ethernet192 17 Eth25-1 10000 24 9126 none +Ethernet193 18 Eth25-2 10000 24 9126 none +Ethernet194 19 Eth25-3 10000 24 9126 none +Ethernet195 20 Eth25-4 10000 24 9126 none +Ethernet200 25 Eth26-1 10000 25 9126 none +Ethernet201 26 Eth26-2 10000 25 9126 none +Ethernet202 27 Eth26-3 10000 25 9126 none +Ethernet203 28 Eth26-4 10000 25 9126 none +Ethernet208 1,2,3,4 Eth27 100000 26 9126 rs +Ethernet216 9,10,11,12 Eth28 100000 27 9126 rs +Ethernet224 241,242,243,244 Eth29 100000 28 9126 none +Ethernet232 249,250,251,252 Eth30 100000 29 9126 none +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236 Eth32 100000 31 9126 none diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml new file mode 100644 index 00000000000..76171942ee0 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "NONE" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "NONE" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "NONE" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "NONE" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "NONE" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "NONE" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A new file mode 100644 index 00000000000..84aa4198360 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..8014caa1da4 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_24x400G_8x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini new file mode 100644 index 00000000000..c9e1c968c30 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 none +Ethernet200 25,26,27,28 Eth26 100000 25 9126 none +Ethernet208 1,2,3,4 Eth27 100000 26 9126 none +Ethernet216 9,10,11,12 Eth28 100000 27 9126 none +Ethernet224 241,242,243,244 Eth29 100000 28 9126 none +Ethernet232 249,250,251,252 Eth30 100000 29 9126 none +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236 Eth32 100000 31 9126 none diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml new file mode 100644 index 00000000000..a6f5d00d8b3 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,425 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml new file mode 100755 index 00000000000..8ae2b9683d4 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini new file mode 100644 index 00000000000..9507616bd5c --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92 Eth1 100000 0 9126 rs +Ethernet8 81,82,83,84 Eth2 100000 1 9126 rs +Ethernet16 73,74,75,76 Eth3 100000 2 9126 rs +Ethernet24 65,66,67,68 Eth4 100000 3 9126 rs +Ethernet32 57,58,59,60 Eth5 100000 4 9126 rs +Ethernet40 49,50,51,52 Eth6 100000 5 9126 rs +Ethernet48 41,42,43,44 Eth7 100000 6 9126 rs +Ethernet56 33,34,35,36 Eth8 100000 7 9126 rs +Ethernet64 153,154,155,156 Eth9 100000 8 9126 rs +Ethernet72 145,146,147,148 Eth10 100000 9 9126 rs +Ethernet80 137,138,139,140 Eth11 100000 10 9126 rs +Ethernet88 129,130,131,132 Eth12 100000 11 9126 rs +Ethernet96 121,122,123,124 Eth13 100000 12 9126 rs +Ethernet104 113,114,115,116 Eth14 100000 13 9126 rs +Ethernet112 105,106,107,108 Eth15 100000 14 9126 rs +Ethernet120 97,98,99,100 Eth16 100000 15 9126 rs +Ethernet128 209,210,211,212 Eth17 100000 16 9126 rs +Ethernet136 217,218,219,220 Eth18 100000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 rs +Ethernet152 201,202,203,204 Eth20 100000 19 9126 rs +Ethernet160 177,178,179,180 Eth21 100000 20 9126 rs +Ethernet168 185,186,187,188 Eth22 100000 21 9126 rs +Ethernet176 161,162,163,164 Eth23 100000 22 9126 rs +Ethernet184 169,170,171,172 Eth24 100000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 rs +Ethernet200 25,26,27,28 Eth26 100000 25 9126 rs +Ethernet208 1,2,3,4 Eth27 100000 26 9126 rs +Ethernet216 9,10,11,12 Eth28 100000 27 9126 rs +Ethernet224 241,242,243,244 Eth29 100000 28 9126 rs +Ethernet232 249,250,251,252 Eth30 100000 29 9126 rs +Ethernet240 225,226,227,228 Eth31 100000 30 9126 rs +Ethernet248 233,234,235,236 Eth32 100000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 new file mode 100644 index 00000000000..1a31812c26b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 new file mode 100644 index 00000000000..93dac6b1992 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml new file mode 100644 index 00000000000..5eb611aa7db --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml @@ -0,0 +1,804 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "90" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "90" + type: "eth" + - fec: "KRFEC" + id: "91" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "91" + type: "eth" + - fec: "KRFEC" + id: "92" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "92" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:1" + serdes_group: "10" + speed: "25G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "82" + lanes: "1:1" + serdes_group: "10" + speed: "25G" + sysport: "82" + type: "eth" + - fec: "KRFEC" + id: "83" + lanes: "2:1" + serdes_group: "10" + speed: "25G" + sysport: "83" + type: "eth" + - fec: "KRFEC" + id: "84" + lanes: "3:1" + serdes_group: "10" + speed: "25G" + sysport: "84" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:1" + serdes_group: "9" + speed: "25G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "74" + lanes: "1:1" + serdes_group: "9" + speed: "25G" + sysport: "74" + type: "eth" + - fec: "KRFEC" + id: "75" + lanes: "2:1" + serdes_group: "9" + speed: "25G" + sysport: "75" + type: "eth" + - fec: "KRFEC" + id: "76" + lanes: "3:1" + serdes_group: "9" + speed: "25G" + sysport: "76" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:1" + serdes_group: "8" + speed: "25G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "66" + lanes: "1:1" + serdes_group: "8" + speed: "25G" + sysport: "66" + type: "eth" + - fec: "KRFEC" + id: "67" + lanes: "2:1" + serdes_group: "8" + speed: "25G" + sysport: "67" + type: "eth" + - fec: "KRFEC" + id: "68" + lanes: "3:1" + serdes_group: "8" + speed: "25G" + sysport: "68" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:1" + serdes_group: "7" + speed: "25G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "58" + lanes: "1:1" + serdes_group: "7" + speed: "25G" + sysport: "58" + type: "eth" + - fec: "KRFEC" + id: "59" + lanes: "2:1" + serdes_group: "7" + speed: "25G" + sysport: "59" + type: "eth" + - fec: "KRFEC" + id: "60" + lanes: "3:1" + serdes_group: "7" + speed: "25G" + sysport: "60" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:1" + serdes_group: "6" + speed: "25G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "50" + lanes: "1:1" + serdes_group: "6" + speed: "25G" + sysport: "50" + type: "eth" + - fec: "KRFEC" + id: "51" + lanes: "2:1" + serdes_group: "6" + speed: "25G" + sysport: "51" + type: "eth" + - fec: "KRFEC" + id: "52" + lanes: "3:1" + serdes_group: "6" + speed: "25G" + sysport: "52" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "42" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "42" + type: "eth" + - fec: "KRFEC" + id: "43" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "43" + type: "eth" + - fec: "KRFEC" + id: "44" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "44" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:1" + serdes_group: "4" + speed: "25G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "34" + lanes: "1:1" + serdes_group: "4" + speed: "25G" + sysport: "34" + type: "eth" + - fec: "KRFEC" + id: "35" + lanes: "2:1" + serdes_group: "4" + speed: "25G" + sysport: "35" + type: "eth" + - fec: "KRFEC" + id: "36" + lanes: "3:1" + serdes_group: "4" + speed: "25G" + sysport: "36" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:1" + serdes_group: "19" + speed: "25G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "154" + lanes: "1:1" + serdes_group: "19" + speed: "25G" + sysport: "154" + type: "eth" + - fec: "KRFEC" + id: "155" + lanes: "2:1" + serdes_group: "19" + speed: "25G" + sysport: "155" + type: "eth" + - fec: "KRFEC" + id: "156" + lanes: "3:1" + serdes_group: "19" + speed: "25G" + sysport: "156" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:1" + serdes_group: "18" + speed: "25G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "146" + lanes: "1:1" + serdes_group: "18" + speed: "25G" + sysport: "146" + type: "eth" + - fec: "KRFEC" + id: "147" + lanes: "2:1" + serdes_group: "18" + speed: "25G" + sysport: "147" + type: "eth" + - fec: "KRFEC" + id: "148" + lanes: "3:1" + serdes_group: "18" + speed: "25G" + sysport: "148" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:1" + serdes_group: "17" + speed: "25G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "138" + lanes: "1:1" + serdes_group: "17" + speed: "25G" + sysport: "138" + type: "eth" + - fec: "KRFEC" + id: "139" + lanes: "2:1" + serdes_group: "17" + speed: "25G" + sysport: "139" + type: "eth" + - fec: "KRFEC" + id: "140" + lanes: "3:1" + serdes_group: "17" + speed: "25G" + sysport: "140" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:1" + serdes_group: "16" + speed: "25G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "130" + lanes: "1:1" + serdes_group: "16" + speed: "25G" + sysport: "130" + type: "eth" + - fec: "KRFEC" + id: "131" + lanes: "2:1" + serdes_group: "16" + speed: "25G" + sysport: "131" + type: "eth" + - fec: "KRFEC" + id: "132" + lanes: "3:1" + serdes_group: "16" + speed: "25G" + sysport: "132" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:1" + serdes_group: "15" + speed: "25G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "122" + lanes: "1:1" + serdes_group: "15" + speed: "25G" + sysport: "122" + type: "eth" + - fec: "KRFEC" + id: "123" + lanes: "2:1" + serdes_group: "15" + speed: "25G" + sysport: "123" + type: "eth" + - fec: "KRFEC" + id: "124" + lanes: "3:1" + serdes_group: "15" + speed: "25G" + sysport: "124" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "114" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "114" + type: "eth" + - fec: "KRFEC" + id: "115" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "115" + type: "eth" + - fec: "KRFEC" + id: "116" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "116" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "106" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "106" + type: "eth" + - fec: "KRFEC" + id: "107" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "107" + type: "eth" + - fec: "KRFEC" + id: "108" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "108" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:1" + serdes_group: "12" + speed: "25G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "98" + lanes: "1:1" + serdes_group: "12" + speed: "25G" + sysport: "98" + type: "eth" + - fec: "KRFEC" + id: "99" + lanes: "2:1" + serdes_group: "12" + speed: "25G" + sysport: "99" + type: "eth" + - fec: "KRFEC" + id: "100" + lanes: "3:1" + serdes_group: "12" + speed: "25G" + sysport: "100" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:1" + serdes_group: "26" + speed: "25G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "210" + lanes: "1:1" + serdes_group: "26" + speed: "25G" + sysport: "210" + type: "eth" + - fec: "KRFEC" + id: "211" + lanes: "2:1" + serdes_group: "26" + speed: "25G" + sysport: "211" + type: "eth" + - fec: "KRFEC" + id: "212" + lanes: "3:1" + serdes_group: "26" + speed: "25G" + sysport: "212" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:1" + serdes_group: "27" + speed: "25G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "218" + lanes: "1:1" + serdes_group: "27" + speed: "25G" + sysport: "218" + type: "eth" + - fec: "KRFEC" + id: "219" + lanes: "2:1" + serdes_group: "27" + speed: "25G" + sysport: "219" + type: "eth" + - fec: "KRFEC" + id: "220" + lanes: "3:1" + serdes_group: "27" + speed: "25G" + sysport: "220" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A new file mode 100644 index 00000000000..84aa4198360 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B new file mode 100644 index 00000000000..27297b31395 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml new file mode 100755 index 00000000000..01fe64ec7bc --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_72x25G_6x400G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml new file mode 100644 index 00000000000..891b0b3e283 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini new file mode 100644 index 00000000000..adcb52ab2a2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini new file mode 100644 index 00000000000..4f3e8d2bd38 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini @@ -0,0 +1,87 @@ +# name lanes alias speed index mtu fec +Ethernet0 89 Eth1-1 25000 0 9126 rs +Ethernet1 90 Eth1-2 25000 0 9126 rs +Ethernet2 91 Eth1-3 25000 0 9126 rs +Ethernet3 92 Eth1-4 25000 0 9126 rs +Ethernet8 81 Eth2-1 25000 1 9126 rs +Ethernet9 82 Eth2-2 25000 1 9126 rs +Ethernet10 83 Eth2-3 25000 1 9126 rs +Ethernet11 84 Eth2-4 25000 1 9126 rs +Ethernet16 73 Eth3-1 25000 2 9126 rs +Ethernet17 74 Eth3-2 25000 2 9126 rs +Ethernet18 75 Eth3-3 25000 2 9126 rs +Ethernet19 76 Eth3-4 25000 2 9126 rs +Ethernet24 65 Eth4-1 25000 3 9126 rs +Ethernet25 66 Eth4-2 25000 3 9126 rs +Ethernet26 67 Eth4-3 25000 3 9126 rs +Ethernet27 68 Eth4-4 25000 3 9126 rs +Ethernet32 57 Eth5-1 25000 4 9126 rs +Ethernet33 58 Eth5-2 25000 4 9126 rs +Ethernet34 59 Eth5-3 25000 4 9126 rs +Ethernet35 60 Eth5-4 25000 4 9126 rs +Ethernet40 49 Eth6-1 25000 5 9126 rs +Ethernet41 50 Eth6-2 25000 5 9126 rs +Ethernet42 51 Eth6-3 25000 5 9126 rs +Ethernet43 52 Eth6-4 25000 5 9126 rs +Ethernet48 41 Eth7-1 25000 6 9126 rs +Ethernet49 42 Eth7-2 25000 6 9126 rs +Ethernet50 43 Eth7-3 25000 6 9126 rs +Ethernet51 44 Eth7-4 25000 6 9126 rs +Ethernet56 33 Eth8-1 25000 7 9126 rs +Ethernet57 34 Eth8-2 25000 7 9126 rs +Ethernet58 35 Eth8-3 25000 7 9126 rs +Ethernet59 36 Eth8-4 25000 7 9126 rs +Ethernet64 153 Eth9-1 25000 8 9126 rs +Ethernet65 154 Eth9-2 25000 8 9126 rs +Ethernet66 155 Eth9-3 25000 8 9126 rs +Ethernet67 156 Eth9-4 25000 8 9126 rs +Ethernet72 145 Eth10-1 25000 9 9126 rs +Ethernet73 146 Eth10-2 25000 9 9126 rs +Ethernet74 147 Eth10-3 25000 9 9126 rs +Ethernet75 148 Eth10-4 25000 9 9126 rs +Ethernet80 137 Eth11-1 25000 10 9126 rs +Ethernet81 138 Eth11-2 25000 10 9126 rs +Ethernet82 139 Eth11-3 25000 10 9126 rs +Ethernet83 140 Eth11-4 25000 10 9126 rs +Ethernet88 129 Eth12-1 25000 11 9126 rs +Ethernet89 130 Eth12-2 25000 11 9126 rs +Ethernet90 131 Eth12-3 25000 11 9126 rs +Ethernet91 132 Eth12-4 25000 11 9126 rs +Ethernet96 121 Eth13-1 25000 12 9126 rs +Ethernet97 122 Eth13-2 25000 12 9126 rs +Ethernet98 123 Eth13-3 25000 12 9126 rs +Ethernet99 124 Eth13-4 25000 12 9126 rs +Ethernet104 113 Eth14-1 25000 13 9126 rs +Ethernet105 114 Eth14-2 25000 13 9126 rs +Ethernet106 115 Eth14-3 25000 13 9126 rs +Ethernet107 116 Eth14-4 25000 13 9126 rs +Ethernet112 105 Eth15-1 25000 14 9126 rs +Ethernet113 106 Eth15-2 25000 14 9126 rs +Ethernet114 107 Eth15-3 25000 14 9126 rs +Ethernet115 108 Eth15-4 25000 14 9126 rs +Ethernet120 97 Eth16-1 25000 15 9126 rs +Ethernet121 98 Eth16-2 25000 15 9126 rs +Ethernet122 99 Eth16-3 25000 15 9126 rs +Ethernet123 100 Eth16-4 25000 15 9126 rs +Ethernet128 209 Eth17-1 25000 16 9126 rs +Ethernet129 210 Eth17-2 25000 16 9126 rs +Ethernet130 211 Eth17-3 25000 16 9126 rs +Ethernet131 212 Eth17-4 25000 16 9126 rs +Ethernet136 217 Eth18-1 25000 17 9126 rs +Ethernet137 218 Eth18-2 25000 17 9126 rs +Ethernet138 219 Eth18-3 25000 17 9126 rs +Ethernet139 220 Eth18-4 25000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 rs +Ethernet152 201,202,203,204 Eth20 100000 19 9126 rs +Ethernet160 177,178,179,180 Eth21 100000 20 9126 rs +Ethernet168 185,186,187,188 Eth22 100000 21 9126 rs +Ethernet176 161,162,163,164 Eth23 100000 22 9126 rs +Ethernet184 169,170,171,172 Eth24 100000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 rs +Ethernet200 25,26,27,28 Eth26 100000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 new file mode 100755 index 00000000000..104d2d78de8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 new file mode 100755 index 00000000000..4b9748c7b59 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "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" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile new file mode 100644 index 00000000000..aba4fc81fb1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku b/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku new file mode 100644 index 00000000000..041c1629fc2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku @@ -0,0 +1 @@ +Wistron_sw_to3200k t1 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf new file mode 100644 index 00000000000..d5f9419d77f --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py new file mode 100755 index 00000000000..9f59510eac2 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +try: + import os + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +def eeprom_check(): + filepath="/sys/bus/i2c/devices/0-0056/eeprom" + if os.path.isfile(filepath): + return 1 #now board, 0x56 + else: + return 0 #now board, 0x57 + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + ret=eeprom_check() + if ret==1: + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + else: + self.eeprom_path = "/sys/bus/i2c/devices/47-0057/eeprom" + + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py new file mode 100755 index 00000000000..2d00aa6282c --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +############################################################################# +# Accton +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/psu_present" + self.psu_oper_status = "/psu_power_good" + self.psu_mapping = { + 2: "0-0051", + 1: "0-0052", + } + + def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py new file mode 100755 index 00000000000..fe59dc7d8ce --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py @@ -0,0 +1,186 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + SONIC_PORT_NAME_PREFIX = "Ethernet" + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + BASE_OOM_PATH = "/sys/bus/i2c/devices/0-00{0}/" + BASE_CPLD1_PATH = "/sys/bus/i2c/devices/0-0061/" + BASE_CPLD2_PATH = "/sys/bus/i2c/devices/0-0062/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: [1, 10], + 1: [2, 11], + 2: [3, 12], + 3: [4, 13], + 4: [5, 14], + 5: [6, 15], + 6: [7, 16], + 7: [8, 17], + 8: [9, 18], + 9: [10, 19], + 10: [11, 20], + 11: [12, 21], + 12: [13, 22], + 13: [14, 23], + 14: [15, 24], + 15: [16, 25], + 16: [17, 26], + 17: [18, 27], + 18: [19, 28], + 19: [20, 29], + 20: [21, 30], + 21: [22, 31], + 22: [23, 32], + 23: [24, 33], + 24: [25, 34], + 25: [26, 35], + 26: [27, 36], + 27: [28, 37], + 28: [29, 38], + 29: [30, 39], + 30: [31, 40], + 31: [32, 41], + } + + @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 is_logical_port(self, port_name): + return True + + def get_logical_to_physical(self, port_name): + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return None + + port_idx = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + port_idx = port_idx // 8 + return [port_idx] + + def __init__(self): + eeprom_path = self.BASE_OOM_PATH + "eeprom1" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x][1]) + + self._transceiver_presence = self._get_sfp_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 + if port_num < 16 : + present_path = self.BASE_CPLD1_PATH + "module_present_" + str(port_num+1) + else: + present_path = self.BASE_CPLD2_PATH + "module_present_" + str(port_num+1) + self.__port_to_is_present = present_path + + try: + val_file = open(self.__port_to_is_present) + content = val_file.readline().rstrip() + val_file.close() + except IOError as e: + print "Error: unable to access file: %s" % str(e) + return False + + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def reset(self, port_num): + raise NotImplementedError + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, self.port_end+1): + port_pres[port] = self.get_presence(port) + + return port_pres + + def get_transceiver_change_event(self, timeout=0): + start_time = time.time() + port_dict = {} + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + change_status = False + + cur_presence = self._get_sfp_presence() + for port in range(0, self.port_end+1): + if cur_presence[port] == 1: + port_dict[port]='1' + else: + port_dict[port]='0' + + if cur_presence[port] != self._transceiver_presence[port]: + change_status = True + + self._transceiver_presence = cur_presence + if change_status: + return True, port_dict + + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, {} + print "get_evt_change_event: Should not reach here." + return False, {} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json new file mode 100644 index 00000000000..94592fa8ceb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config b/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config new file mode 100644 index 00000000000..9a16887e3ad --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config @@ -0,0 +1,5135 @@ + + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + + - id: "0" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "-1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "2" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "3" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "5" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 1, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "6" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "7" + pre1: "4, 4, 2, 4, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "9" + pre1: "2, 2, 2, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 2, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "10" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 2, 2, 4, 2, 6, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "11" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, -1, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 0, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "13" + pre1: "2, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "14" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "-1, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 1, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "15" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "17" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "18" + pre1: "2, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "19" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "20" + pre1: "2, 4, 2, 2, 2, 2, 4, 2" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "21" + pre1: "2, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "22" + pre1: "4, 2, 4, 4, 4, 2, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "23" + pre1: "4, 4, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "24" + pre1: "4, 2, 4, 2, 4, 2, 2, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "25" + pre1: "4, 2, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 0, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "26" + pre1: "2, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 1" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 2, 2, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "28" + pre1: "4, 2, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "30" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "31" + pre1: "4, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "-1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "2" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "3" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "5" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 1, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "6" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "7" + pre1: "4, 4, 2, 4, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "9" + pre1: "2, 2, 2, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 2, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "10" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 2, 2, 4, 2, 6, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "11" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, -1, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 0, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "13" + pre1: "2, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "14" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "-1, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 1, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "15" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "17" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "18" + pre1: "2, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "19" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "20" + pre1: "2, 4, 2, 2, 2, 2, 4, 2" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "21" + pre1: "2, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "22" + pre1: "4, 2, 4, 4, 4, 2, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "23" + pre1: "4, 4, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "24" + pre1: "4, 2, 4, 2, 4, 2, 2, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "25" + pre1: "4, 2, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 0, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "26" + pre1: "2, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 1" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 2, 2, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "28" + pre1: "4, 2, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "30" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "31" + pre1: "4, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf new file mode 100644 index 00000000000..795ea43143e --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/dockers/docker-base-stretch/Dockerfile.j2 b/dockers/docker-base-stretch/Dockerfile.j2 index 49b6aa16ab5..b696d0a2e0d 100644 --- a/dockers/docker-base-stretch/Dockerfile.j2 +++ b/dockers/docker-base-stretch/Dockerfile.j2 @@ -1,10 +1,11 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% from "dockers/dockerfile-macros.j2" import install_debian_packages, install_python_wheels, copy_files %} {% if CONFIGURED_ARCH == "armhf" %} -FROM multiarch/debian-debootstrap:armhf-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-stretch {% elif CONFIGURED_ARCH == "arm64" %} -FROM multiarch/debian-debootstrap:arm64-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-stretch {% else %} -FROM debian:stretch +FROM {{ prefix }}debian:stretch {% endif %} # Clean documentation in FROM image @@ -45,7 +46,6 @@ RUN apt-get update && \ procps \ python \ python-pip \ - rsyslog \ vim-tiny \ # Install dependencies of supervisor python-pkg-resources \ @@ -55,7 +55,9 @@ RUN apt-get update && \ libjemalloc1 \ liblua5.1-0 \ lua-bitop \ - lua-cjson + lua-cjson \ +# for processing json files in bash environment + jq {% if CONFIGURED_ARCH == "armhf" %} # ip and ifconfig utility missing in docker for armhf @@ -64,6 +66,9 @@ RUN apt-get -y install \ net-tools {% endif %} +# Install a newer version of rsyslog from stretch-backports to support -iNONE +RUN apt-get -y -t stretch-backports install rsyslog + # For templating RUN pip install j2cli @@ -83,6 +88,9 @@ RUN apt-get -y purge \ {{ install_debian_packages(docker_base_stretch_debs.split(' ')) }} {%- endif %} +# Add support for supervisord to handle startup dependencies +RUN pip install supervisord-dependent-startup==1.4.0 'toposort<=1.7' + # Clean up apt # Remove /var/lib/apt/lists/*, could be obsoleted for derived images RUN apt-get clean -y && \ diff --git a/dockers/docker-base-stretch/etc/rsyslog.d/supervisor.conf b/dockers/docker-base-stretch/etc/rsyslog.d/supervisor.conf index 7c7a64d7afe..fde8d8a6c99 100644 --- a/dockers/docker-base-stretch/etc/rsyslog.d/supervisor.conf +++ b/dockers/docker-base-stretch/etc/rsyslog.d/supervisor.conf @@ -1,9 +1,9 @@ -$ModLoad imfile - -$InputFileName /var/log/supervisor/supervisord.log -$InputFileTag supervisord -$InputFileStateFile state-supervisor -$InputFileSeverity info -$InputFileFacility local0 -$InputFilePersistStateInterval 1 -$InputRunFileMonitor +module(load="imfile" mode="inotify") # Ensure "inotify" mode is used +$WorkDirectory /var/log/supervisor +# Start Monitoring the file +input(type="imfile" + File="/var/log/supervisor/supervisord.log" + Tag="supervisord" + Severity="info" + Facility="local0" + PersistStateInterval="1") diff --git a/dockers/docker-base-stretch/etc/supervisor/supervisord.conf b/dockers/docker-base-stretch/etc/supervisor/supervisord.conf index 5d1010e8fa4..6d7d7390e85 100644 --- a/dockers/docker-base-stretch/etc/supervisor/supervisord.conf +++ b/dockers/docker-base-stretch/etc/supervisor/supervisord.conf @@ -3,8 +3,6 @@ [unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file) chmod=0700 ; socket file mode (default 0700) -username=dummy -password=dummy [supervisord] logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) @@ -20,8 +18,6 @@ supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket -username=dummy -password=dummy ; The [include] section can just contain the "files" setting. This ; setting can list multiple files (separated by whitespace or diff --git a/dockers/docker-base-stretch/sources.list b/dockers/docker-base-stretch/sources.list index 752b1bb4fc6..516363f4927 100644 --- a/dockers/docker-base-stretch/sources.list +++ b/dockers/docker-base-stretch/sources.list @@ -1,8 +1,8 @@ ## Debian mirror on Microsoft Azure ## Ref: http://debian-archive.trafficmanager.net/ -deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ stretch main contrib non-free -deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian/ stretch main contrib non-free -deb [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ stretch/updates main contrib non-free -deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ stretch/updates main contrib non-free -deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ stretch-backports main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z stretch/updates main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z stretch/updates main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch-backports main contrib non-free diff --git a/dockers/docker-base-stretch/sources.list.arm64 b/dockers/docker-base-stretch/sources.list.arm64 index b2e0a329d0b..b31ceed2d66 100644 --- a/dockers/docker-base-stretch/sources.list.arm64 +++ b/dockers/docker-base-stretch/sources.list.arm64 @@ -1,7 +1,7 @@ ## Debian mirror for ARM repo # ARM repo -deb [arch=arm64] http://deb.debian.org/debian stretch main contrib non-free -deb-src [arch=arm64] http://deb.debian.org/debian stretch main contrib non-free +deb [arch=arm64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb-src [arch=arm64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free deb [arch=arm64] http://security.debian.org stretch/updates main contrib non-free deb-src [arch=arm64] http://security.debian.org stretch/updates main contrib non-free diff --git a/dockers/docker-base-stretch/sources.list.armhf b/dockers/docker-base-stretch/sources.list.armhf index 884a091175a..09d05f78139 100644 --- a/dockers/docker-base-stretch/sources.list.armhf +++ b/dockers/docker-base-stretch/sources.list.armhf @@ -1,7 +1,7 @@ ## Debian mirror for ARM repo # ARM repo -deb [arch=armhf] http://deb.debian.org/debian stretch main contrib non-free -deb-src [arch=armhf] http://deb.debian.org/debian stretch main contrib non-free +deb [arch=armhf] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb-src [arch=armhf] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free deb [arch=armhf] http://security.debian.org stretch/updates main contrib non-free deb-src [arch=armhf] http://security.debian.org stretch/updates main contrib non-free diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index e45235a1e13..a2f818a031a 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -1,9 +1,10 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% if CONFIGURED_ARCH == "armhf" %} -FROM multiarch/debian-debootstrap:armhf-jessie +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-jessie {% elif CONFIGURED_ARCH == "arm64" %} -FROM multiarch/debian-debootstrap:arm64-jessie +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-jessie {% else %} -FROM debian:jessie +FROM {{ prefix }}/debian:jessie {% endif %} ## Remove retired jessie-updates repo @@ -37,7 +38,12 @@ COPY ["no-check-valid-until", "/etc/apt/apt.conf.d"] COPY ["sources.list", "/etc/apt/sources.list"] {% endif %} COPY ["no_install_recommend_suggest", "/etc/apt/apt.conf.d"] -RUN apt-get update + +COPY ["faketime_0.9.7-2_amd64.deb", "/root"] +COPY ["libfaketime_0.9.7-2_amd64.deb","/root"] +RUN dpkg -i /root/faketime_0.9.7-2_amd64.deb /root/libfaketime_0.9.7-2_amd64.deb +RUN rm /root/faketime_0.9.7-2_amd64.deb /root/libfaketime_0.9.7-2_amd64.deb +RUN faketime "2022-11-01" apt-get update # Pre-install fundamental packages RUN apt-get -y install \ diff --git a/dockers/docker-base/etc/rsyslog.d/supervisor.conf b/dockers/docker-base/etc/rsyslog.d/supervisor.conf index 7c7a64d7afe..ce70f10e6e7 100644 --- a/dockers/docker-base/etc/rsyslog.d/supervisor.conf +++ b/dockers/docker-base/etc/rsyslog.d/supervisor.conf @@ -1,9 +1,9 @@ -$ModLoad imfile - -$InputFileName /var/log/supervisor/supervisord.log -$InputFileTag supervisord -$InputFileStateFile state-supervisor -$InputFileSeverity info -$InputFileFacility local0 -$InputFilePersistStateInterval 1 -$InputRunFileMonitor +module(load="imfile") #By default notify mode +$WorkDirectory /var/log/supervisor +# Start Monitoring the file +input(type="imfile" + File="/var/log/supervisor/supervisord.log" + Tag="supervisord" + Severity="info" + Facility="local0" + PersistStateInterval="1") diff --git a/dockers/docker-base/sources.list b/dockers/docker-base/sources.list index afdff92d3c7..0b60f2068fb 100644 --- a/dockers/docker-base/sources.list +++ b/dockers/docker-base/sources.list @@ -1,7 +1,7 @@ ## Debian mirror on Microsoft Azure ## Ref: http://debian-archive.trafficmanager.net/ -deb [arch=amd64] http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free -deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free -deb [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free -deb-src [arch=amd64] http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ jessie main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ jessie main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z jessie/updates main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z jessie/updates main contrib non-free diff --git a/dockers/docker-base/sources.list.armhf b/dockers/docker-base/sources.list.armhf index 18f71fc31fc..00d7692207e 100644 --- a/dockers/docker-base/sources.list.armhf +++ b/dockers/docker-base/sources.list.armhf @@ -1,7 +1,7 @@ ## Debian mirror for ARM repo # ARMhf repo -deb [arch=armhf] http://deb.debian.org/debian jessie main contrib non-free -deb-src [arch=armhf] http://deb.debian.org/debian jessie main contrib non-free -deb [arch=armhf] http://security.debian.org jessie/updates main contrib non-free -deb-src [arch=armhf] http://security.debian.org jessie/updates main contrib non-free +deb [arch=armhf] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ jessie main contrib non-free +deb-src [arch=armhf] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ jessie main contrib non-free +deb [arch=armhf] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z/ jessie/updates main contrib non-free +deb-src [arch=armhf] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z/ jessie/updates main contrib non-free diff --git a/dockers/docker-basic_router/Dockerfile b/dockers/docker-basic_router/Dockerfile index 7d7c724920c..b7b44971159 100644 --- a/dockers/docker-basic_router/Dockerfile +++ b/dockers/docker-basic_router/Dockerfile @@ -6,7 +6,7 @@ MAINTAINER Xudong Wu ENV DEBIAN_FRONTEND=noninteractive ## Update apt's cache of available packages -RUN apt-get clean && apt-get update +RUN apt-get clean && faketime "2022-11-01" apt-get update COPY deps /deps diff --git a/dockers/docker-config-engine/Dockerfile.j2 b/dockers/docker-config-engine/Dockerfile.j2 index ba72cce31d4..51b6ddaca11 100644 --- a/dockers/docker-config-engine/Dockerfile.j2 +++ b/dockers/docker-config-engine/Dockerfile.j2 @@ -3,7 +3,7 @@ FROM docker-base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update +RUN faketime "2022-11-01" apt-get update # Dependencies for sonic-cfggen RUN apt-get install -y python-lxml python-yaml python-bitarray python-pip python-dev python-natsort diff --git a/dockers/docker-database/base_image_files/monit_database b/dockers/docker-database/base_image_files/monit_database index c5508922864..47c9d1b2d47 100644 --- a/dockers/docker-database/base_image_files/monit_database +++ b/dockers/docker-database/base_image_files/monit_database @@ -3,5 +3,5 @@ ## process list: ## redis_server ############################################################################### -check process redis_server matching "/usr/bin/redis-server" - if does not exist for 5 times within 5 cycles then alert +check program database|redis_server with path "/usr/bin/process_checker database /usr/bin/redis-server" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles diff --git a/dockers/docker-database/database_config.json.j2 b/dockers/docker-database/database_config.json.j2 index 6d116b5e1ae..242b065eb39 100644 --- a/dockers/docker-database/database_config.json.j2 +++ b/dockers/docker-database/database_config.json.j2 @@ -52,6 +52,11 @@ "id" : 7, "separator": "|", "instance" : "redis" + }, + "RESTAPI_DB" : { + "id" : 8, + "separator": "|", + "instance" : "redis" } }, "VERSION" : "1.0" diff --git a/dockers/docker-database/supervisord.conf.j2 b/dockers/docker-database/supervisord.conf.j2 index efeedd0439c..ae937f71436 100644 --- a/dockers/docker-database/supervisord.conf.j2 +++ b/dockers/docker-database/supervisord.conf.j2 @@ -8,9 +8,10 @@ command=/usr/bin/supervisor-proc-exit-listener --container-name database events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected +buffer_size=1024 [program:rsyslogd] -command=/bin/bash -c "rm -f /var/run/rsyslogd.pid && /usr/sbin/rsyslogd -n" +command=/usr/sbin/rsyslogd -n -iNONE priority=1 autostart=true autorestart=false diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 index d3c09f9ba26..22662fbb7f7 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -25,7 +25,8 @@ RUN apt-get clean -y && \ rm -rf /debs COPY ["docker_init.sh", "start.sh", "/usr/bin/"] -COPY ["docker-dhcp-relay.supervisord.conf.j2", "wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] +COPY ["docker-dhcp-relay.supervisord.conf.j2", "port-name-alias-map.txt.j2", "wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] +COPY ["dhcp-relay.programs.j2", "dhcpv4-relay.agents.j2", "dhcpv6-relay.agents.j2", "dhcp-relay.monitors.j2", "/usr/share/sonic/templates/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] diff --git a/dockers/docker-dhcp-relay/base_image_files/monit_dhcp_relay.j2 b/dockers/docker-dhcp-relay/base_image_files/monit_dhcp_relay.j2 new file mode 100644 index 00000000000..78bfc196616 --- /dev/null +++ b/dockers/docker-dhcp-relay/base_image_files/monit_dhcp_relay.j2 @@ -0,0 +1,37 @@ +{# This template file is used to generate Monit configuration file of dhcp_relay container -#} + +################################################################################ +## Monit configuration file for dhcp_relay container +## process list: +## dhcrelay +################################################################################ +{# If our configuration has VLANs... #} +{% if VLAN_INTERFACE %} +{# Count how may VLANs require a DHCP relay agent... #} +{% set num_relays = namespace(count=0) %} +{% for vlan_name in VLAN_INTERFACE %} +{% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} +{% set num_relays.count = num_relays.count + 1 %} +{% endif %} +{% endfor %} +{# if one or more VLANs require DHCP relay agent #} +{% if num_relays.count > 0 %} +{% set relay_for_ipv4 = namespace(flag=False) %} +{% for vlan_name in VLAN_INTERFACE %} +{% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length >0 %} +{% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} +{% if dhcp_server | ipv4 %} +{% set relay_for_ipv4.flag = True %} +{% endif %} +{% endfor %} +{% if relay_for_ipv4.flag %} +{% set relay_for_ipv4 = False %} +{# Check the running status of each DHCP relay agent instance #} +check program dhcp_relay|dhcrelay_{{ vlan_name }} with path "/usr/bin/process_checker dhcp_relay /usr/sbin/dhcrelay -d -m discard -a %h:%p %P --name-alias-map-file /tmp/port-name-alias-map.txt -id {{ vlan_name }}" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles + +{% endif %} +{% endif %} +{% endfor %} +{% endif %} +{% endif %} diff --git a/dockers/docker-dhcp-relay/critical_processes b/dockers/docker-dhcp-relay/critical_processes index 855851bf2d6..43bf6af2794 100644 --- a/dockers/docker-dhcp-relay/critical_processes +++ b/dockers/docker-dhcp-relay/critical_processes @@ -1 +1 @@ -group:isc-dhcp-relay +group:dhcp-relay diff --git a/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 b/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 new file mode 100644 index 00000000000..4c6438fc99f --- /dev/null +++ b/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 @@ -0,0 +1,63 @@ +[group:dhcpmon] +programs= +{%- set add_preceding_comma = { 'flag': False } %} +{% set monitor_instance = { 'flag': False } %} +{% for vlan_name in VLAN_INTERFACE %} +{% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} +{% set _dummy = monitor_instance.update({'flag': True}) %} +{%- endif %} +{% if monitor_instance.flag %} +{% if add_preceding_comma.flag %},{% endif %} +{% set _dummy = add_preceding_comma.update({'flag': True}) %} +dhcpmon-{{ vlan_name }} +{%- set _dummy = monitor_instance.update({'flag': False}) %} +{%- endif %} +{% endfor %} + + +{# Create a program entry for each DHCP MONitor instance #} +{% set relay_for_ipv4 = { 'flag': False } %} +{% for vlan_name in VLAN_INTERFACE %} +{# Check DHCPv4 agents #} +{% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} +{% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} +{% if dhcp_server | ipv4 %} +{% set _dummy = relay_for_ipv4.update({'flag': True}) %} +{% endif %} +{% endfor %} +{% endif %} +{% if relay_for_ipv4.flag %} +[program:dhcpmon-{{ vlan_name }}] +{# We treat this VLAN as a downstream interface (-id), as we only want to listen for requests #} +command=/usr/sbin/dhcpmon -id {{ vlan_name }} +{#- Dual ToR Option #} +{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %} -u Loopback0{% endif -%} +{#- We treat all other interfaces as upstream interfaces (-iu), as we only want to listen for replies #} +{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} +{% if prefix | ipv4 and name != vlan_name %} -iu {{ name }}{% endif -%} +{% endfor %} +{% for (name, prefix) in INTERFACE|pfx_filter %} +{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} +{% endfor %} +{% for (name, prefix) in PORTCHANNEL_INTERFACE|pfx_filter %} +{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} +{% endfor %} +{% if MGMT_INTERFACE %} +{% for (name, prefix) in MGMT_INTERFACE|pfx_filter %} +{% if prefix | ipv4 %} -im {{ name }}{% endif -%} +{% endfor %} +{% endif %} + +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for= +{%- if relay_for_ipv4.flag %}isc-dhcpv4-relay-{{ vlan_name }}:running {% endif %} + + +{% set _dummy = relay_for_ipv4.update({'flag': False}) %} +{% endif %} +{% endfor %} diff --git a/dockers/docker-dhcp-relay/dhcp-relay.programs.j2 b/dockers/docker-dhcp-relay/dhcp-relay.programs.j2 new file mode 100644 index 00000000000..9d5b62c6b23 --- /dev/null +++ b/dockers/docker-dhcp-relay/dhcp-relay.programs.j2 @@ -0,0 +1,22 @@ +[group:dhcp-relay] +programs= +{%- set relay_for_ipv6 = { 'flag': False } %} +{%- set add_preceding_comma = { 'flag': False } %} +{% for vlan_name in VLAN_INTERFACE %} +{# Append DHCPv4 agents #} +{% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} +{% if add_preceding_comma.flag %},{% endif %} +{% set _dummy = add_preceding_comma.update({'flag': True}) %} +isc-dhcpv4-relay-{{ vlan_name }} +{%- endif %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and DHCP_RELAY[vlan_name]['dhcpv6_servers']|length > 0 %} +{% set _dummy = relay_for_ipv6.update({'flag': True}) %} +{%- endif %} +{% endfor %} +{# Append DHCPv6 agents #} +{% if relay_for_ipv6.flag %} +{% if add_preceding_comma.flag %},{% endif %} +{% set _dummy = add_preceding_comma.update({'flag': True}) %} +dhcp6relay +{% endif %} + diff --git a/dockers/docker-dhcp-relay/dhcpv4-relay.agents.j2 b/dockers/docker-dhcp-relay/dhcpv4-relay.agents.j2 new file mode 100644 index 00000000000..499afed54ef --- /dev/null +++ b/dockers/docker-dhcp-relay/dhcpv4-relay.agents.j2 @@ -0,0 +1,41 @@ +{# Append DHCPv4 agents #} +{% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} +{% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} +{% if dhcp_server | ipv4 %} +{% set _dummy = relay_for_ipv4.update({'flag': True}) %} +{% endif %} +{% endfor %} +{% if relay_for_ipv4.flag %} +{% set _dummy = relay_for_ipv4.update({'flag': False}) %} + +[program:isc-dhcpv4-relay-{{ vlan_name }}] +{# We treat this VLAN as a downstream interface (-id), as we only want to listen for requests #} +command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id {{ vlan_name }} +{#- Dual ToR Option #} +{% if 'subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' %} -U Loopback0 -dt{% endif -%} +{#- si option to use intf addr in relay #} +{% if DEVICE_METADATA['localhost']['deployment_id'] == '8' %} -si{% endif -%} +{#- We treat all other interfaces as upstream interfaces (-iu), as we only want to listen for replies #} +{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} +{% if prefix | ipv4 and name != vlan_name %} -iu {{ name }}{% endif -%} +{% endfor %} +{% for (name, prefix) in INTERFACE|pfx_filter %} +{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} +{% endfor %} +{% for (name, prefix) in PORTCHANNEL_INTERFACE|pfx_filter %} +{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} +{% endfor %} +{% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} +{%- if dhcp_server | ipv4 %} {{ dhcp_server }}{% endif -%} +{% endfor %} + +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + +{% endif %} +{% endif %} diff --git a/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 b/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 new file mode 100644 index 00000000000..134280e5231 --- /dev/null +++ b/dockers/docker-dhcp-relay/dhcpv6-relay.agents.j2 @@ -0,0 +1,24 @@ +{# Append DHCPv6 agents #} +{# Create a program entry for each DHCPv6 relay agent instance #} +{% for vlan_name in VLAN_INTERFACE %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and 'dhcpv6_servers' in DHCP_RELAY[vlan_name] %} +{% for dhcpv6_server in DHCP_RELAY[vlan_name]['dhcpv6_servers'] %} +{% if dhcpv6_server | ipv6 %} +{% set _dummy = relay_for_ipv6.update({'flag': True}) %} +{% endif %} +{% endfor %} +{% if relay_for_ipv6.flag %} +{% set _dummy = relay_for_ipv6.update({'flag': False}) %} +[program:dhcp6relay] +command=/usr/sbin/dhcp6relay +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + +{% endif %} +{% endif %} +{% endfor %} diff --git a/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 index d5240048077..e9c043dc260 100644 --- a/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 +++ b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 @@ -3,135 +3,65 @@ 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 +buffer_size=1024 + [eventlistener:supervisor-proc-exit-listener] command=/usr/bin/supervisor-proc-exit-listener --container-name dhcp_relay events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected +buffer_size=1024 -[program:start.sh] -command=/usr/bin/start.sh +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE priority=1 -autostart=true +autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n +[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 {# If our configuration has VLANs... #} -{% if VLAN %} -{# Count how many VLANs require a DHCP relay agent... #} -{% set num_relays = { 'count': 0 } %} -{% for vlan_name in VLAN %} -{% if VLAN[vlan_name]['dhcp_servers'] %} -{% set _dummy = num_relays.update({'count': num_relays.count + 1}) %} +{% if VLAN_INTERFACE %} +{% set ipv4_num_relays = { 'count': 0 } %} +{% set ipv6_num_relays = { 'count': 0 } %} +{% for vlan_name in VLAN_INTERFACE %} +{% if VLAN and vlan_name in VLAN and 'dhcp_servers' in VLAN[vlan_name] and VLAN[vlan_name]['dhcp_servers']|length > 0 %} +{% set _dummy = ipv4_num_relays.update({'count': ipv4_num_relays.count + 1}) %} {% endif %} -{% endfor %} -{# If one or more of the VLANs require a DHCP relay agent... #} -{% if num_relays.count > 0 %} -[group:isc-dhcp-relay] -programs= -{%- set add_preceding_comma = { 'flag': False } %} -{% for vlan_name in VLAN %} -{% if VLAN[vlan_name]['dhcp_servers'] %} -{% if add_preceding_comma.flag %},{% endif %} -{% set _dummy = add_preceding_comma.update({'flag': True}) %} -isc-dhcp-relay-{{ vlan_name }} -{%- endif %} -{% endfor %} - - -{# Create a program entry for each DHCP relay agent instance #} -{% set relay_for_ipv4 = { 'flag': False } %} -{% for vlan_name in VLAN %} -{% if VLAN[vlan_name]['dhcp_servers'] %} -{% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} -{% if dhcp_server | ipv4 %} -{% set _dummy = relay_for_ipv4.update({'flag': True}) %} +{% if DHCP_RELAY and vlan_name in DHCP_RELAY and 'dhcpv6_servers' in DHCP_RELAY[vlan_name] %} +{% set _dummy = ipv6_num_relays.update({'count': ipv6_num_relays.count + 1}) %} {% endif %} {% endfor %} -{% if relay_for_ipv4.flag %} -{% set _dummy = relay_for_ipv4.update({'flag': False}) %} -[program:isc-dhcp-relay-{{ vlan_name }}] -{# We treat this VLAN as a downstream interface (-id), as we only want to listen for requests #} -command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -id {{ vlan_name }} -{#- We treat all other interfaces as upstream interfaces (-iu), as we only want to listen for replies #} -{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} -{% if prefix | ipv4 and name != vlan_name %} -iu {{ name }}{% endif -%} -{% endfor %} -{% for (name, prefix) in INTERFACE|pfx_filter %} -{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} -{% endfor %} -{% for (name, prefix) in PORTCHANNEL_INTERFACE|pfx_filter %} -{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} -{% endfor %} -{% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} -{%- if dhcp_server | ipv4 %} {{ dhcp_server }}{% endif -%} -{% endfor %} - -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -{% endif %} -{% endif %} -{% endfor %} - -[group:dhcpmon] -programs= -{%- set add_preceding_comma = { 'flag': False } %} -{% for vlan_name in VLAN %} -{% if VLAN[vlan_name]['dhcp_servers'] %} -{% if add_preceding_comma.flag %},{% endif %} -{% set _dummy = add_preceding_comma.update({'flag': True}) %} -dhcpmon-{{ vlan_name }} -{%- endif %} -{% endfor %} - +{# If one or more of the VLANs require a DHCP relay agent... #} +{% if ipv4_num_relays.count > 0 or ipv6_num_relays.count > 0 %} +{% include 'dhcp-relay.programs.j2' %} -{# Create a program entry for each DHCP MONitor instance #} {% set relay_for_ipv4 = { 'flag': False } %} -{% for vlan_name in VLAN %} -{% if VLAN[vlan_name]['dhcp_servers'] %} -{% for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} -{% if dhcp_server | ipv4 %} -{% set _dummy = relay_for_ipv4.update({'flag': True}) %} -{% endif %} -{% endfor %} -{% if relay_for_ipv4.flag %} -{% set _dummy = relay_for_ipv4.update({'flag': False}) %} -[program:dhcpmon-{{ vlan_name }}] -{# We treat this VLAN as a downstream interface (-id), as we only want to listen for requests #} -command=/usr/sbin/dhcpmon -id {{ vlan_name }} -{#- We treat all other interfaces as upstream interfaces (-iu), as we only want to listen for replies #} -{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} -{% if prefix | ipv4 and name != vlan_name %} -iu {{ name }}{% endif -%} -{% endfor %} -{% for (name, prefix) in INTERFACE|pfx_filter %} -{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} -{% endfor %} -{% for (name, prefix) in PORTCHANNEL_INTERFACE|pfx_filter %} -{% if prefix | ipv4 %} -iu {{ name }}{% endif -%} -{% endfor %} - -priority=4 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -{% endif %} -{% endif %} +{% set relay_for_ipv6 = { 'flag': False } %} +{% for vlan_name in VLAN_INTERFACE %} +{% include 'dhcpv4-relay.agents.j2' %} {% endfor %} +{% include 'dhcpv6-relay.agents.j2' %} +{% include 'dhcp-relay.monitors.j2' %} {% endif %} {% endif %} diff --git a/dockers/docker-dhcp-relay/docker_init.sh b/dockers/docker-dhcp-relay/docker_init.sh index f6d402e6f78..9fc7a93e995 100755 --- a/dockers/docker-dhcp-relay/docker_init.sh +++ b/dockers/docker-dhcp-relay/docker_init.sh @@ -2,15 +2,21 @@ # Generate supervisord config file mkdir -p /etc/supervisor/conf.d/ -sonic-cfggen -d -t /usr/share/sonic/templates/docker-dhcp-relay.supervisord.conf.j2 > /etc/supervisor/conf.d/docker-dhcp-relay.supervisord.conf -# Generate the script that waits for all interfaces to come up and make it executable -sonic-cfggen -d -t /usr/share/sonic/templates/wait_for_intf.sh.j2 > /usr/bin/wait_for_intf.sh -chmod +x /usr/bin/wait_for_intf.sh +# Generate the following files from templates: +# 1. supervisord configuration +# 2. wait_for_intf.sh, which waits for all interfaces to come up +# 3. port-to-alias name map +CFGGEN_PARAMS=" \ + -d \ + -t /usr/share/sonic/templates/docker-dhcp-relay.supervisord.conf.j2,/etc/supervisor/conf.d/docker-dhcp-relay.supervisord.conf \ + -t /usr/share/sonic/templates/wait_for_intf.sh.j2,/usr/bin/wait_for_intf.sh \ + -t /usr/share/sonic/templates/port-name-alias-map.txt.j2,/tmp/port-name-alias-map.txt \ +" +sonic-cfggen $CFGGEN_PARAMS -# Generate port name-alias map for isc-dhcp-relay to parse. Each line contains one -# name-alias pair of the form " " -sonic-cfggen -d --var-json "PORT" | python -c "import sys, json, os; [sys.stdout.write('%s %s\n' % (k, v['alias'] if 'alias' in v else k)) for (k, v) in json.load(sys.stdin).iteritems()]" > /tmp/port-name-alias-map.txt +# Make the script that waits for all interfaces to come up executable +chmod +x /usr/bin/wait_for_intf.sh # The docker container should start this script as PID 1, so now that supervisord is # properly configured, we exec supervisord so that it runs as PID 1 for the diff --git a/dockers/docker-dhcp-relay/port-name-alias-map.txt.j2 b/dockers/docker-dhcp-relay/port-name-alias-map.txt.j2 new file mode 100644 index 00000000000..b2290a9ffbf --- /dev/null +++ b/dockers/docker-dhcp-relay/port-name-alias-map.txt.j2 @@ -0,0 +1,5 @@ +{# Generate port name-alias map for isc-dhcp-relay to parse. Each line contains one #} +{# name-alias pair of the form " " #} +{% for port, config in PORT.items() %} + {{- port }} {% if "alias" in config %}{{ config["alias"] }}{% else %}{{ port }}{% endif %} {{- "\n" -}} +{% endfor -%} diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index dbbf3225108..2488137378a 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -1,13 +1,7 @@ #!/usr/bin/env bash -# Remove stale rsyslog PID file if it exists -rm -f /var/run/rsyslogd.pid - -# Start rsyslog -supervisorctl start rsyslogd - # If our supervisor config has entries in the "isc-dhcp-relay" group... -if [ $(supervisorctl status | grep -c "^isc-dhcp-relay:") -gt 0 ]; then +if [ $(supervisorctl status | grep -c "^dhcp-relay:") -gt 0 ]; then # Wait for all interfaces to come up and be assigned IPv4 addresses before # starting the DHCP relay agent(s). If an interface the relay should listen # on is down, the relay agent will not start. If an interface the relay @@ -15,13 +9,4 @@ if [ $(supervisorctl status | grep -c "^isc-dhcp-relay:") -gt 0 ]; then # relay agent starts, it will not listen or send on that interface for the # lifetime of the process. /usr/bin/wait_for_intf.sh - - # Start all DHCP relay agent(s) - supervisorctl start isc-dhcp-relay:* -fi - -# If our supervisor config has entries in the "dhcpmon" group... -if [ $(supervisorctl status | grep -c "^dhcpmon:") -gt 0 ]; then - # Start all DHCP Monitor daemon(s) - supervisorctl start dhcpmon:* fi diff --git a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 index 568f128b377..b224a697b5b 100644 --- a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 +++ b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 @@ -38,3 +38,8 @@ wait_until_iface_ready {{ name }} {{ prefix }} wait_until_iface_ready {{ name }} {{ prefix }} {% endif %} {% endfor %} + +# Wait 10 seconds for the rest of interfaces to get added/populated. +# dhcrelay listens on each of the interfaces (in addition to the port +# channels and vlan interfaces) +sleep 10 diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 index 04f3e441678..d9e3fa5bf0e 100644 --- a/dockers/docker-fpm-frr/Dockerfile.j2 +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -58,6 +58,7 @@ COPY ["snmp.conf", "/etc/snmp/frr.conf"] COPY ["TSA", "/usr/bin/TSA"] COPY ["TSB", "/usr/bin/TSB"] COPY ["TSC", "/usr/bin/TSC"] +COPY ["TS", "/usr/bin/TS"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] RUN chmod a+x /usr/bin/TSA && \ diff --git a/dockers/docker-fpm-frr/TS b/dockers/docker-fpm-frr/TS new file mode 100755 index 00000000000..5057802c766 --- /dev/null +++ b/dockers/docker-fpm-frr/TS @@ -0,0 +1,52 @@ +#!/bin/bash + +# Check whether the routemap is for internal BGP sessions. +function is_internal_route_map() +{ + [[ "$1" =~ .*"_INTERNAL_".* ]] +} + +function check_not_installed() +{ + c=0 + config=$(vtysh -c "show run") + for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p' | egrep 'V4|V6' | uniq); + do + is_internal_route_map $route_map_name && continue + echo "$config" | egrep -q "^route-map $route_map_name permit 20$" + c=$((c+$?)) + echo "$config" | egrep -q "^route-map $route_map_name deny 30$" + c=$((c+$?)) + done + return $c +} + +function check_installed() +{ + c=0 + e=0 + config=$(vtysh -c "show run") + for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p' | egrep 'V4|V6' | uniq); + do + is_internal_route_map $route_map_name && continue + echo "$config" | egrep -q "^route-map $route_map_name permit 20$" + c=$((c+$?)) + e=$((e+1)) + echo "$config" | egrep -q "^route-map $route_map_name deny 30$" + c=$((c+$?)) + e=$((e+1)) + done + return $((e-c)) +} + +function find_num_routemap() +{ + c=0 + config=$(vtysh -c "show run") + for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p' | egrep 'V4|V6' | uniq); + do + is_internal_route_map $route_map_name && continue + c=$((c+1)) + done + return $c +} diff --git a/dockers/docker-fpm-frr/TSA b/dockers/docker-fpm-frr/TSA index 441765694a4..f45d3bf0bcb 100755 --- a/dockers/docker-fpm-frr/TSA +++ b/dockers/docker-fpm-frr/TSA @@ -1,35 +1,36 @@ #!/bin/bash -function check_not_installed() -{ - c=0 - config=$(vtysh -c "show run") - for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p'); - do - echo "$config" | grep -q "route-map $route_map_name permit 2" - c=$((c+$?)) - echo "$config" | grep -q "route-map $route_map_name deny 3" - c=$((c+$?)) - done - return $c -} +# Load the common functions +source /usr/bin/TS +find_num_routemap +routemap_count=$? check_not_installed not_installed=$? -if [[ $not_installed -ne 0 ]]; + +if [[ $routemap_count -eq 0 ]]; +then + echo "System Mode: No external neighbors" +elif [[ $not_installed -ne 0 ]]; then TSA_FILE=$(mktemp) - for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p'); + for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p' | uniq); do + is_internal_route_map $route_map_name && continue case "$route_map_name" in *V4*) ip_version=V4 + ip_protocol=ip ;; *V6*) ip_version=V6 + ip_protocol=ipv6 + ;; + *) + continue ;; esac - sonic-cfggen -d -a "{\"route_map_name\":\"$route_map_name\", \"ip_version\": \"$ip_version\"}" -y /etc/sonic/constants.yml -t /usr/share/sonic/templates/bgpd/tsa/bgpd.tsa.isolate.conf.j2 > "$TSA_FILE" + sonic-cfggen -d -a "{\"route_map_name\":\"$route_map_name\", \"ip_version\": \"$ip_version\", \"ip_protocol\": \"$ip_protocol\"}" -y /etc/sonic/constants.yml -t /usr/share/sonic/templates/bgpd/tsa/bgpd.tsa.isolate.conf.j2 > "$TSA_FILE" vtysh -f "$TSA_FILE" rm -f "$TSA_FILE" done diff --git a/dockers/docker-fpm-frr/TSB b/dockers/docker-fpm-frr/TSB index 84a3c183e65..50f1ebc3ce8 100755 --- a/dockers/docker-fpm-frr/TSB +++ b/dockers/docker-fpm-frr/TSB @@ -1,29 +1,31 @@ #!/bin/bash -function check_installed() -{ - c=0 - e=0 - config=$(vtysh -c "show run") - for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p'); - do - echo "$config" | grep -q "route-map $route_map_name permit 2" - c=$((c+$?)) - e=$((e+1)) - echo "$config" | grep -q "route-map $route_map_name deny 3" - c=$((c+$?)) - e=$((e+1)) - done - return $((e-c)) -} +# Load the common functions +source /usr/bin/TS +find_num_routemap +routemap_count=$? check_installed installed=$? -if [[ $installed -ne 0 ]]; + +if [[ $routemap_count -eq 0 ]]; +then + echo "System Mode: No external neighbors" +elif [[ $installed -ne 0 ]]; then TSB_FILE=$(mktemp) - for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p'); + for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p' | uniq); do + is_internal_route_map $route_map_name && continue + case "$route_map_name" in + *V4*) + ;; + *V6*) + ;; + *) + continue + ;; + esac sonic-cfggen -d -a "{\"route_map_name\":\"$route_map_name\"}" -t /usr/share/sonic/templates/bgpd/tsa/bgpd.tsa.unisolate.conf.j2 > "$TSB_FILE" vtysh -f "$TSB_FILE" rm -f "$TSB_FILE" diff --git a/dockers/docker-fpm-frr/TSC b/dockers/docker-fpm-frr/TSC index 3a3ad73d00b..45d22bdf55c 100755 --- a/dockers/docker-fpm-frr/TSC +++ b/dockers/docker-fpm-frr/TSC @@ -1,45 +1,20 @@ #!/bin/bash -function check_not_installed() -{ - c=0 - config=$(vtysh -c "show run") - for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p'); - do - echo "$config" | grep -q "route-map $route_map_name permit 2" - c=$((c+$?)) - echo "$config" | grep -q "route-map $route_map_name deny 3" - c=$((c+$?)) - done - return $c -} - -function check_installed() -{ - c=0 - e=0 - config=$(vtysh -c "show run") - for route_map_name in $(echo "$config" | sed -ne 's/ neighbor \S* route-map \(\S*\) out/\1/p'); - do - echo "$config" | grep -q "route-map $route_map_name permit 2" - c=$((c+$?)) - e=$((e+1)) - echo "$config" | grep -q "route-map $route_map_name deny 3" - c=$((c+$?)) - e=$((e+1)) - done - return $((e-c)) -} - -echo "Traffic Shift Check:" +# Load the common functions +source /usr/bin/TS +find_num_routemap +routemap_count=$? check_not_installed not_installed=$? check_installed installed=$? -if [[ $installed -eq 0 ]]; +if [[ $routemap_count -eq 0 ]]; +then + echo "System Mode: No external neighbors" +elif [[ $installed -eq 0 ]]; then echo "System Mode: Normal" elif [[ $not_installed -eq 0 ]]; @@ -48,5 +23,3 @@ then else echo "System Mode: Not consistent" fi - -echo diff --git a/dockers/docker-fpm-frr/base_image_files/TS b/dockers/docker-fpm-frr/base_image_files/TS new file mode 100755 index 00000000000..de1e50b7a30 --- /dev/null +++ b/dockers/docker-fpm-frr/base_image_files/TS @@ -0,0 +1,29 @@ +#!/bin/bash + +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + +PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} + +# Parse the device specific asic conf file, if it exists +ASIC_CONF=/usr/share/sonic/device/$PLATFORM/asic.conf +[ -f $ASIC_CONF ] && . $ASIC_CONF + +if [[ ($NUM_ASIC -gt 1) ]]; then + asic=0 + NAMESPACE_PREFIX='asic' + + while [ $asic -lt $NUM_ASIC ] + do + # Run TSA/TSB/TSC scripts in BGP instance for frontend ASICs. + sub_role=`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['sub_role']" -n $NAMESPACE_PREFIX$asic` + if [ $sub_role == 'FrontEnd' ] + then + echo -e "BGP"$asic" : \c" + docker exec -i bgp$asic /usr/bin/$1 + fi + asic=$[$asic+1] + done +else + docker exec -i bgp /usr/bin/$1 +fi diff --git a/dockers/docker-fpm-frr/base_image_files/TSA b/dockers/docker-fpm-frr/base_image_files/TSA index 95c7957f7dc..e96c76dd67b 100755 --- a/dockers/docker-fpm-frr/base_image_files/TSA +++ b/dockers/docker-fpm-frr/base_image_files/TSA @@ -1,3 +1,3 @@ #!/bin/bash -docker exec -i bgp /usr/bin/TSA +/usr/bin/TS TSA diff --git a/dockers/docker-fpm-frr/base_image_files/TSB b/dockers/docker-fpm-frr/base_image_files/TSB index f292d2031db..176b10c684c 100755 --- a/dockers/docker-fpm-frr/base_image_files/TSB +++ b/dockers/docker-fpm-frr/base_image_files/TSB @@ -1,3 +1,3 @@ #!/bin/bash -docker exec -i bgp /usr/bin/TSB +/usr/bin/TS TSB diff --git a/dockers/docker-fpm-frr/base_image_files/TSC b/dockers/docker-fpm-frr/base_image_files/TSC index f0ccebb73d6..80e5680b4a0 100755 --- a/dockers/docker-fpm-frr/base_image_files/TSC +++ b/dockers/docker-fpm-frr/base_image_files/TSC @@ -1,5 +1,5 @@ #!/bin/bash -docker exec -i bgp /usr/bin/TSC +/usr/bin/TS TSC /usr/bin/portstat -p 5 diff --git a/dockers/docker-fpm-frr/base_image_files/monit_bgp b/dockers/docker-fpm-frr/base_image_files/monit_bgp index 5dbb794c346..3361b9e64f3 100644 --- a/dockers/docker-fpm-frr/base_image_files/monit_bgp +++ b/dockers/docker-fpm-frr/base_image_files/monit_bgp @@ -6,18 +6,22 @@ ## bgpd ## staticd ## bgpcfgd +## bgpmon ############################################################################### -check process zebra matching "/usr/lib/frr/zebra" - if does not exist for 5 times within 5 cycles then alert +check program bgp|zebra with path "/usr/bin/process_checker bgp /usr/lib/frr/zebra" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process fpmsyncd matching "fpmsyncd" - if does not exist for 5 times within 5 cycles then alert +check program bgp|fpmsyncd with path "/usr/bin/process_checker bgp fpmsyncd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process bgpd matching "/usr/lib/frr/bgpd" - if does not exist for 5 times within 5 cycles then alert +check program bgp|bgpd with path "/usr/bin/process_checker bgp /usr/lib/frr/bgpd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process staticd matching "/usr/lib/frr/staticd" - if does not exist for 5 times within 5 cycles then alert +check program bgp|staticd with path "/usr/bin/process_checker bgp /usr/lib/frr/staticd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process bgpcfgd matching "python /usr/local/bin/bgpcfgd" - if does not exist for 5 times within 5 cycles then alert +check program bgp|bgpcfgd with path "/usr/bin/process_checker bgp /usr/bin/python /usr/local/bin/bgpcfgd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles + +check program bgp|bgpmon with path "/usr/bin/process_checker bgp /usr/bin/python /usr/local/bin/bgpmon" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles diff --git a/dockers/docker-fpm-frr/base_image_files/rvtysh b/dockers/docker-fpm-frr/base_image_files/rvtysh new file mode 100755 index 00000000000..81fb23046a6 --- /dev/null +++ b/dockers/docker-fpm-frr/base_image_files/rvtysh @@ -0,0 +1,22 @@ +#!/bin/bash + +# The command rvtysh can be run as root priviledge by any user without password, only allow to execute readonly commands. + +# The options in the show command cannot contains any charactors to run multiple sub-commands potentially, such as "\n", "\r", "|", "&", "$" and ";". +if printf -- "$*" | grep -qPz '[\n\r|&$;]'; then + echo "Not allow to run the command, please use the comand 'sudo vtysh' instead." 1>&2 + exit 1 +fi + +# The sub commands must start with "show" +LAST_PARAM= +for param in "$@" +do + if [ "$LAST_PARAM" == "-c" ] && [[ "$param" != show* ]]; then + echo "Not allow to run the command '$param', please use the comand 'sudo vtysh' instead." 1>&2 + exit 1 + fi + LAST_PARAM=$param +done + +vtysh "$@" diff --git a/dockers/docker-fpm-frr/base_image_files/vtysh b/dockers/docker-fpm-frr/base_image_files/vtysh index 24016bd96b2..e4efeb454cb 100755 --- a/dockers/docker-fpm-frr/base_image_files/vtysh +++ b/dockers/docker-fpm-frr/base_image_files/vtysh @@ -1,4 +1,37 @@ #!/bin/bash +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + +function help() +{ + echo -e "Usage: $0 -n [0 to $(($NUM_ASIC-1))] [OPTION]... " 1>&2; exit 1; +} + +DEV="" +PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} + +# Parse the device specific asic conf file, if it exists +ASIC_CONF=/usr/share/sonic/device/$PLATFORM/asic.conf +[ -f $ASIC_CONF ] && . $ASIC_CONF + +if [[ ($NUM_ASIC -gt 1) ]]; then + while getopts ":n:h:" opt; do + case "${opt}" in + h) help + ;; + n) DEV=${OPTARG} + [ $DEV -lt $NUM_ASIC -a $DEV -ge 0 ] || help + ;; + esac + done + + if [ -z "${DEV}" ]; then + help + fi + + # Skip the arguments -n while passing to docker command + shift 2 +fi # Determine whether stdout is on a terminal if [ -t 1 ] ; then @@ -7,10 +40,10 @@ if [ -t 1 ] ; then TTY=$(tty) function cleanup { - docker exec -i bgp pkill -HUP -f "vtysh $TTY" + docker exec -i bgp$DEV pkill -HUP -f "vtysh $TTY" } trap cleanup HUP - docker exec -ti bgp vtysh "$TTY" "$@" + docker exec -ti bgp$DEV vtysh "$TTY" "$@" else - docker exec -i bgp vtysh "$@" + docker exec -i bgp$DEV vtysh "$@" fi diff --git a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 index ef98dcf9f16..8fb9646e9fa 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 @@ -1,4 +1,4 @@ -{% from "common/functions.conf.j2" import get_ipv4_loopback_address, get_ipv6_loopback_address %} +{% from "common/functions.conf.j2" import get_ipv4_loopback_address, get_ipv6_loopback_address, get_vnet_interfaces %} ! ! template: bgpd/bgpd.main.conf.j2 ! @@ -14,10 +14,31 @@ ip prefix-list PL_LoopbackV4 permit {{ get_ipv4_loopback_address(LOOPBACK_INTERF ipv6 prefix-list PL_LoopbackV6 permit {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | replace('/128', '/64') | ip_network }}/64 {% endif %} ! +{% if VLAN_INTERFACE is defined %} +{% set vnet_intfs = get_vnet_interfaces(VLAN_INTERFACE) %} +{% endif %} +{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} +{% if prefix | ipv4 and name not in vnet_intfs %} +ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq {{ loop.index * 5 }} permit {{ prefix }} ! -{% if DEVICE_METADATA['localhost']['sub_role'] == 'FrontEnd' %} +{% endif %} +{% endfor %} +{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} +{% if prefix | ipv6 and name not in vnet_intfs %} +ipv6 prefix-list LOCAL_VLAN_IPV6_PREFIX seq {{ loop.index * 5 }} permit {{ prefix }} +! +{% endif %} +{% endfor %} +! +{% if DEVICE_METADATA['localhost']['sub_role'] == 'FrontEnd' or DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} route-map HIDE_INTERNAL permit 10 - set community local-AS + set community no-export +{% if constants.bgp.peers is defined and constants.bgp.peers.internal is defined and constants.bgp.peers.internal.community is defined %} + on-match next +route-map HIDE_INTERNAL permit 20 + set community {{ constants.bgp.peers.internal.community }} additive +{% endif %} +{% set multi_asic = True %} ! {% endif %} ! @@ -31,30 +52,44 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp bestpath as-path multipath-relax {% endif %} ! -{% if constants.bgp.graceful_restart.enabled is defined and constants.bgp.graceful_restart.enabled %} +{% if constants.bgp.graceful_restart.enabled is defined and constants.bgp.graceful_restart.enabled and DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} bgp graceful-restart restart-time {{ constants.bgp.graceful_restart.restart_time | default(240) }} bgp graceful-restart bgp graceful-restart preserve-fw-state {% endif %} ! {# set router-id #} +{% if DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} + bgp router-id {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") | ip }} +{% else %} bgp router-id {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }} +{% endif %} ! {# advertise loopback #} network {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/32 +{% if multi_asic is defined %} + network {{ get_ipv4_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") | ip }}/32 route-map HIDE_INTERNAL +{% endif %} ! {% if get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") != 'None' %} address-family ipv6 network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") | ip }}/64 exit-address-family {% endif %} +{% if multi_asic is defined %} +{% if get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") != 'None' %} + address-family ipv6 + network {{ get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback4096") | ip }}/128 route-map HIDE_INTERNAL + exit-address-family +{% endif %} +{% endif %} {% endblock bgp_init %} ! {% block vlan_advertisement %} {% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} -{% if prefix | ipv4 %} +{% if prefix | ipv4 and name not in vnet_intfs %} network {{ prefix }} -{% elif prefix | ipv6 %} +{% elif prefix | ipv6 and name not in vnet_intfs %} address-family ipv6 network {{ prefix }} exit-address-family diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2 index e4422a77166..f078449ed8a 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2 @@ -15,27 +15,22 @@ ! {% if neighbor_addr | ipv4 %} address-family ipv4 -{% if 'ASIC' in bgp_session['name'] %} - neighbor {{ neighbor_addr }} peer-group PEER_V4_INT -{% else %} neighbor {{ neighbor_addr }} peer-group PEER_V4 -{% endif %} -! -{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} - neighbor {{ neighbor_addr }} route-map FROM_BGP_PEER_V4_INT in +{% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'LeafRouter' %} +{% if CONFIG_DB__BGP_BBR['status'] == 'enabled' %} + neighbor {{ neighbor_addr }} allowas-in 1 +{% endif %} {% endif %} ! {% elif neighbor_addr | ipv6 %} address-family ipv6 -{% if 'ASIC' in bgp_session['name'] %} - neighbor {{ neighbor_addr }} peer-group PEER_V6_INT -{% else %} neighbor {{ neighbor_addr }} peer-group PEER_V6 +{% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'LeafRouter' %} +{% if CONFIG_DB__BGP_BBR['status'] == 'enabled' %} + neighbor {{ neighbor_addr }} allowas-in 1 +{% endif %} {% endif %} ! -{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} - neighbor {{ neighbor_addr }} route-map FROM_BGP_PEER_V6_INT in -{% endif %} {% endif %} ! {% if bgp_session.has_key('rrclient') and bgp_session['rrclient'] | int != 0 %} @@ -45,10 +40,6 @@ {% if bgp_session.has_key('nhopself') and bgp_session['nhopself'] | int != 0 %} neighbor {{ neighbor_addr }} next-hop-self {% endif %} -! -{% if 'ASIC' in bgp_session['name'] %} - neighbor {{ neighbor_addr }} next-hop-self force -{% endif %} ! neighbor {{ neighbor_addr }} activate exit-address-family diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2 index b0acd1b2a46..551274902de 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2 @@ -2,38 +2,22 @@ ! template: bgpd/templates/general/peer-group.conf.j2 ! neighbor PEER_V4 peer-group - neighbor PEER_V4_INT peer-group neighbor PEER_V6 peer-group - neighbor PEER_V6_INT peer-group address-family ipv4 {% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor PEER_V4 allowas-in 1 - neighbor PEER_V4_INT allowas-in 1 -{% endif %} -{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} - neighbor PEER_V4_INT route-reflector-client {% endif %} neighbor PEER_V4 soft-reconfiguration inbound neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in neighbor PEER_V4 route-map TO_BGP_PEER_V4 out - neighbor PEER_V4_INT soft-reconfiguration inbound - neighbor PEER_V4_INT route-map FROM_BGP_PEER_V4 in - neighbor PEER_V4_INT route-map TO_BGP_PEER_V4 out exit-address-family address-family ipv6 {% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor PEER_V6 allowas-in 1 - neighbor PEER_V6_INT allowas-in 1 - {% endif %} -{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} - neighbor PEER_V6_INT route-reflector-client {% endif %} neighbor PEER_V6 soft-reconfiguration inbound neighbor PEER_V6 route-map FROM_BGP_PEER_V6 in neighbor PEER_V6 route-map TO_BGP_PEER_V6 out - neighbor PEER_V6_INT soft-reconfiguration inbound - neighbor PEER_V6_INT route-map FROM_BGP_PEER_V6 in - neighbor PEER_V6_INT route-map TO_BGP_PEER_V6 out exit-address-family ! ! end of template: bgpd/templates/general/peer-group.conf.j2 diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/general/policies.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/general/policies.conf.j2 index c545cf27289..02340c4373d 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/general/policies.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/general/policies.conf.j2 @@ -3,6 +3,50 @@ ! ! ! +{% if constants.bgp.allow_list is defined and constants.bgp.allow_list.enabled is defined and constants.bgp.allow_list.enabled and constants.bgp.allow_list.drop_community is defined %} +! +! +! please don't remove. 65535 entries are default rules +! which works when allow_list is enabled, but new configuration +! is not applied +! +{% if allow_list_default_action == 'deny' %} +! +route-map ALLOW_LIST_DEPLOYMENT_ID_0_V4 permit 65535 + set community no-export additive +! +route-map ALLOW_LIST_DEPLOYMENT_ID_0_V6 permit 65535 + set community no-export additive +{% else %} +! +route-map ALLOW_LIST_DEPLOYMENT_ID_0_V4 permit 65535 + set community {{ constants.bgp.allow_list.drop_community }} additive +! +route-map ALLOW_LIST_DEPLOYMENT_ID_0_V6 permit 65535 + set community {{ constants.bgp.allow_list.drop_community }} additive +{% endif %} +! +bgp community-list standard allow_list_default_community permit no-export +bgp community-list standard allow_list_default_community permit {{ constants.bgp.allow_list.drop_community }} +! +route-map FROM_BGP_PEER_V4 permit 10 + call ALLOW_LIST_DEPLOYMENT_ID_0_V4 + on-match next +! +route-map FROM_BGP_PEER_V4 permit 11 + match community allow_list_default_community +! +route-map FROM_BGP_PEER_V6 permit 10 + call ALLOW_LIST_DEPLOYMENT_ID_0_V6 + on-match next +! +route-map FROM_BGP_PEER_V6 permit 11 + match community allow_list_default_community +! +{% endif %} +! +! +! route-map FROM_BGP_PEER_V4 permit 100 ! route-map TO_BGP_PEER_V4 permit 100 @@ -15,16 +59,5 @@ route-map FROM_BGP_PEER_V6 permit 100 ! route-map TO_BGP_PEER_V6 permit 100 ! -{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} -route-map FROM_BGP_PEER_V4_INT permit 2 - set originator-id {{ loopback0_ipv4 | ip }} -! -route-map FROM_BGP_PEER_V6_INT permit 1 - set ipv6 next-hop prefer-global -! -route-map FROM_BGP_PEER_V6_INT permit 2 - set originator-id {{ loopback0_ipv4 | ip }} -{% endif %} -! ! end of template: bgpd/templates/general/policies.conf.j2 ! diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/internal/instance.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/instance.conf.j2 new file mode 100644 index 00000000000..bb6f838032c --- /dev/null +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/instance.conf.j2 @@ -0,0 +1,38 @@ +! +! template: bgpd/templates/internal/instance.conf.j2 +! + neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} + neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} + neighbor {{ neighbor_addr }} timers 3 10 + neighbor {{ neighbor_addr }} timers connect 10 +! +{% if neighbor_addr | ipv4 %} + address-family ipv4 + neighbor {{ neighbor_addr }} peer-group INTERNAL_PEER_V4 +! +{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} + neighbor {{ neighbor_addr }} next-hop-self force + neighbor {{ neighbor_addr }} route-map FROM_BGP_INTERNAL_PEER_V4 in +{% endif %} +! +{% elif neighbor_addr | ipv6 %} + address-family ipv6 + neighbor {{ neighbor_addr }} peer-group INTERNAL_PEER_V6 +! +{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} + neighbor {{ neighbor_addr }} next-hop-self force + neighbor {{ neighbor_addr }} route-map FROM_BGP_INTERNAL_PEER_V6 in +{% endif %} +{% endif %} +! +{% if bgp_session.has_key('rrclient') and bgp_session['rrclient'] | int != 0 %} + neighbor {{ neighbor_addr }} route-reflector-client +{% endif %} +! +! + neighbor {{ neighbor_addr }} allowas-in 1 + neighbor {{ neighbor_addr }} activate + exit-address-family +! +! end of template: bgpd/templates/internal/instance.conf.j2 +! diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/internal/peer-group.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/peer-group.conf.j2 new file mode 100644 index 00000000000..323c13447ed --- /dev/null +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/peer-group.conf.j2 @@ -0,0 +1,24 @@ +! +! template: bgpd/templates/internal/peer-group.conf.j2 +! + neighbor INTERNAL_PEER_V4 peer-group + neighbor INTERNAL_PEER_V6 peer-group + address-family ipv4 +{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} + neighbor INTERNAL_PEER_V4 route-reflector-client +{% endif %} + neighbor INTERNAL_PEER_V4 soft-reconfiguration inbound + neighbor INTERNAL_PEER_V4 route-map FROM_BGP_INTERNAL_PEER_V4 in + neighbor INTERNAL_PEER_V4 route-map TO_BGP_INTERNAL_PEER_V4 out + exit-address-family + address-family ipv6 +{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} + neighbor INTERNAL_PEER_V6 route-reflector-client +{% endif %} + neighbor INTERNAL_PEER_V6 soft-reconfiguration inbound + neighbor INTERNAL_PEER_V6 route-map FROM_BGP_INTERNAL_PEER_V6 in + neighbor INTERNAL_PEER_V6 route-map TO_BGP_INTERNAL_PEER_V6 out + exit-address-family +! +! end of template: bgpd/templates/internal/peer-group.conf.j2 +! diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/internal/policies.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/policies.conf.j2 new file mode 100644 index 00000000000..855a6863565 --- /dev/null +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/internal/policies.conf.j2 @@ -0,0 +1,29 @@ +! +! template: bgpd/templates/internal/policies.conf.j2 +! +! +{% from "common/functions.conf.j2" import get_ipv4_loopback_address %} +! +route-map FROM_BGP_INTERNAL_PEER_V4 permit 100 +! +route-map TO_BGP_INTERNAL_PEER_V4 permit 100 +! +! +route-map FROM_BGP_INTERNAL_PEER_V6 permit 1 + set ipv6 next-hop prefer-global + on-match next +! +route-map FROM_BGP_INTERNAL_PEER_V6 permit 100 +! +route-map TO_BGP_INTERNAL_PEER_V6 permit 100 +! +{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %} +route-map FROM_BGP_INTERNAL_PEER_V4 permit 2 + set originator-id {{ get_ipv4_loopback_address(CONFIG_DB__LOOPBACK_INTERFACE, "Loopback4096") | ip }} +! +route-map FROM_BGP_INTERNAL_PEER_V6 permit 2 + set originator-id {{ get_ipv4_loopback_address(CONFIG_DB__LOOPBACK_INTERFACE, "Loopback4096") | ip }} +{% endif %} +! +! end of template: bgpd/templates/internal/policies.conf.j2 +! diff --git a/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.isolate.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.isolate.conf.j2 index 88b1c5acb2e..1256d1cd4f9 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.isolate.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.isolate.conf.j2 @@ -1,5 +1,5 @@ -route-map {{ route_map_name }} permit 2 - match ip address prefix-list PL_Loopback{{ ip_version }} +route-map {{ route_map_name }} permit 20 + match {{ ip_protocol }} address prefix-list PL_Loopback{{ ip_version }} set community {{ constants.bgp.traffic_shift_community }} -route-map {{ route_map_name }} deny 3 +route-map {{ route_map_name }} deny 30 ! diff --git a/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.unisolate.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.unisolate.conf.j2 index 22244b3ac88..649f6d8e9db 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.unisolate.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/tsa/bgpd.tsa.unisolate.conf.j2 @@ -1,3 +1,3 @@ -no route-map {{ route_map_name }} permit 2 -no route-map {{ route_map_name }} deny 3 +no route-map {{ route_map_name }} permit 20 +no route-map {{ route_map_name }} deny 30 ! diff --git a/dockers/docker-fpm-frr/frr/common/functions.conf.j2 b/dockers/docker-fpm-frr/frr/common/functions.conf.j2 index 9857f068fe9..2049e114142 100644 --- a/dockers/docker-fpm-frr/frr/common/functions.conf.j2 +++ b/dockers/docker-fpm-frr/frr/common/functions.conf.j2 @@ -21,3 +21,15 @@ {% endfor %} {{ L.ip }} {%- endmacro %} + +{% macro get_vnet_interfaces(interfaces) -%} +{% set L = namespace(intfs=[]) %} +{% set vnet_intfs = [] %} +{% for (key, metadata) in interfaces.iteritems() %} +{% if metadata.has_key("vnet_name") %} +{% set vnet_intfs = vnet_intfs.append(key) %} +{% endif %} +{% endfor %} +{% set L.intfs = vnet_intfs %} +{{ L.intfs }} +{%- endmacro %} diff --git a/dockers/docker-fpm-frr/frr/frr.conf.j2 b/dockers/docker-fpm-frr/frr/frr.conf.j2 index 9e5def4ba01..278855e693f 100644 --- a/dockers/docker-fpm-frr/frr/frr.conf.j2 +++ b/dockers/docker-fpm-frr/frr/frr.conf.j2 @@ -13,7 +13,5 @@ agentx ! {% include "zebra/zebra.interfaces.conf.j2" %} ! -{% include "staticd/staticd.default_route.conf.j2" %} -! {% include "bgpd/bgpd.main.conf.j2" %} ! diff --git a/dockers/docker-fpm-frr/frr/frr_vars.j2 b/dockers/docker-fpm-frr/frr/frr_vars.j2 new file mode 100644 index 00000000000..9909604e5f1 --- /dev/null +++ b/dockers/docker-fpm-frr/frr/frr_vars.j2 @@ -0,0 +1 @@ +{{ DEVICE_METADATA["localhost"]["docker_routing_config_mode"] }} diff --git a/dockers/docker-fpm-frr/frr/staticd/staticd.conf.j2 b/dockers/docker-fpm-frr/frr/staticd/staticd.conf.j2 index 932871dfce4..921fc3f5571 100644 --- a/dockers/docker-fpm-frr/frr/staticd/staticd.conf.j2 +++ b/dockers/docker-fpm-frr/frr/staticd/staticd.conf.j2 @@ -8,5 +8,3 @@ ! {% include "common/daemons.common.conf.j2" %} ! -{% include "staticd.default_route.conf.j2" %} -! diff --git a/dockers/docker-fpm-frr/frr/staticd/staticd.default_route.conf.j2 b/dockers/docker-fpm-frr/frr/staticd/staticd.default_route.conf.j2 deleted file mode 100644 index 22d61ebbd0f..00000000000 --- a/dockers/docker-fpm-frr/frr/staticd/staticd.default_route.conf.j2 +++ /dev/null @@ -1,10 +0,0 @@ -! -{% block default_route %} -! set static default route to mgmt gateway as a backup to learned default -{% for (name, prefix) in MGMT_INTERFACE|pfx_filter %} -{% if prefix | ipv4 %} -ip route 0.0.0.0/0 {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} 200 -{% endif %} -{% endfor %} -{% endblock default_route %} -! diff --git a/dockers/docker-fpm-frr/frr/zebra/zebra.interfaces.conf.j2 b/dockers/docker-fpm-frr/frr/zebra/zebra.interfaces.conf.j2 index 484efeba585..e1bba383bcf 100644 --- a/dockers/docker-fpm-frr/frr/zebra/zebra.interfaces.conf.j2 +++ b/dockers/docker-fpm-frr/frr/zebra/zebra.interfaces.conf.j2 @@ -10,6 +10,8 @@ vni {{ vnet_metadata['vni'] }} {% endblock vrf %} ! {% block interfaces %} +! Enable nht through default route +ip nht resolve-via-default ! Enable link-detect (default disabled) {% for (name, prefix) in INTERFACE|pfx_filter %} interface {{ name }} diff --git a/dockers/docker-fpm-frr/start.sh b/dockers/docker-fpm-frr/start.sh index ab56cb42b2f..72376ab71e9 100755 --- a/dockers/docker-fpm-frr/start.sh +++ b/dockers/docker-fpm-frr/start.sh @@ -1,20 +1,34 @@ #!/usr/bin/env bash mkdir -p /etc/frr +mkdir -p /etc/supervisor/conf.d -CONFIG_TYPE=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["docker_routing_config_mode"]'` +CFGGEN_PARAMS=" \ + -d \ + -y /etc/sonic/constants.yml \ + -t /usr/share/sonic/templates/frr_vars.j2 \ + -t /usr/share/sonic/templates/bgpd/bgpd.conf.j2,/etc/frr/bgpd.conf \ + -t /usr/share/sonic/templates/zebra/zebra.conf.j2,/etc/frr/zebra.conf \ + -t /usr/share/sonic/templates/staticd/staticd.conf.j2,/etc/frr/staticd.conf \ + -t /usr/share/sonic/templates/frr.conf.j2,/etc/frr/frr.conf \ + -t /usr/share/sonic/templates/isolate.j2,/usr/sbin/bgp-isolate \ + -t /usr/share/sonic/templates/unisolate.j2,/usr/sbin/bgp-unisolate \ +" +CONFIG_TYPE=$(sonic-cfggen $CFGGEN_PARAMS) -if [[ ! -z "$NAMESPACE_ID" ]]; then +update_default_gw() +{ + IP_VER=${1} # FRR is not running in host namespace so we need to delete # default gw kernel route added by docker network via eth0 and add it back # with higher administrative distance so that default route learnt # by FRR becomes best route if/when available - GATEWAY_IP=$(ip route show 0.0.0.0/0 dev eth0 | awk '{print $3}') + GATEWAY_IP=$(ip -${IP_VER} route show default dev eth0 | awk '{print $3}') #Check if docker default route is there if [[ ! -z "$GATEWAY_IP" ]]; then - ip route del 0.0.0.0/0 dev eth0 + ip -${IP_VER} route del default dev eth0 #Make sure route is deleted - CHECK_GATEWAY_IP=$(ip route show 0.0.0.0/0 dev eth0 | awk '{print $3}') + CHECK_GATEWAY_IP=$(ip -${IP_VER} route show default dev eth0 | awk '{print $3}') if [[ -z "$CHECK_GATEWAY_IP" ]]; then # Ref: http://docs.frrouting.org/en/latest/zebra.html#zebra-vrf # Zebra does treat Kernel routes as special case for the purposes of Admin Distance. \ @@ -22,30 +36,34 @@ if [[ ! -z "$NAMESPACE_ID" ]]; then # The top byte of the value is interpreted as the Administrative Distance and # the low three bytes are read in as the metric. # so here we are programming administrative distance of 210 (210 << 24) > 200 (for routes learnt via IBGP) - ip route add 0.0.0.0/0 via $GATEWAY_IP dev eth0 metric 3523215360 + ip -${IP_VER} route add default via $GATEWAY_IP dev eth0 metric 3523215360 + fi + if [[ "$IP_VER" == "4" ]]; then + # Add route in default table. This is needed for BGPMON to route BGP Ipv4 loopback + # traffic from namespace to host + ip -${IP_VER} route add table default default via $GATEWAY_IP dev eth0 metric 3523215360 fi fi +} + +if [[ ! -z "$NAMESPACE_ID" ]]; then + update_default_gw 4 + update_default_gw 6 fi if [ -z "$CONFIG_TYPE" ] || [ "$CONFIG_TYPE" == "separated" ]; then - sonic-cfggen -d -t /usr/share/sonic/templates/bgpd/bgpd.conf.j2 -y /etc/sonic/constants.yml > /etc/frr/bgpd.conf - sonic-cfggen -d -t /usr/share/sonic/templates/zebra/zebra.conf.j2 > /etc/frr/zebra.conf - sonic-cfggen -d -t /usr/share/sonic/templates/staticd/staticd.conf.j2 > /etc/frr/staticd.conf echo "no service integrated-vtysh-config" > /etc/frr/vtysh.conf rm -f /etc/frr/frr.conf elif [ "$CONFIG_TYPE" == "unified" ]; then - sonic-cfggen -d -y /etc/sonic/constants.yml -t /usr/share/sonic/templates/frr.conf.j2 >/etc/frr/frr.conf echo "service integrated-vtysh-config" > /etc/frr/vtysh.conf rm -f /etc/frr/bgpd.conf /etc/frr/zebra.conf /etc/frr/staticd.conf fi chown -R frr:frr /etc/frr/ -sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -d -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate @@ -57,13 +75,25 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd # start eoiu pulling, only if configured so -if [[ $(sonic-cfggen -d -v 'WARM_RESTART.bgp.bgp_eoiu') == 'true' ]]; then +if [[ $(sonic-cfggen -d -v 'WARM_RESTART.bgp.bgp_eoiu if WARM_RESTART and WARM_RESTART.bgp and WARM_RESTART.bgp.bgp_eoiu') == 'true' ]]; then supervisorctl start bgp_eoiu_marker fi # Start Quagga processes supervisorctl start zebra supervisorctl start staticd + +addr="127.0.0.1" +port=2601 +start=$(date +%s.%N) +timeout 5s bash -c -- "until /etc/gobgp/gobgpd.conf -sonic-cfggen -d -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/quagga/zebra.conf -sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate +CFGGEN_PARAMS=" \ + -d \ + -t /usr/share/sonic/templates/gobgpd.conf.j2,/etc/gobgp/gobgpd.conf \ + -t /usr/share/sonic/templates/zebra.conf.j2,/etc/quagga/zebra.conf \ + -t /usr/share/sonic/templates/isolate.j2,/usr/sbin/bgp-isolate \ + -t /usr/share/sonic/templates/unisolate.j2,/usr/sbin/bgp-unisolate \ +" +sonic-cfggen $CFGGEN_PARAMS + chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -d -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate diff --git a/dockers/docker-fpm-gobgp/supervisord.conf b/dockers/docker-fpm-gobgp/supervisord.conf index b814dc024fa..7f7e319e9cb 100644 --- a/dockers/docker-fpm-gobgp/supervisord.conf +++ b/dockers/docker-fpm-gobgp/supervisord.conf @@ -8,6 +8,7 @@ command=/usr/bin/supervisor-proc-exit-listener --container-name bgp events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected +buffer_size=1024 [program:start.sh] command=/usr/bin/start.sh diff --git a/dockers/docker-fpm-quagga/Dockerfile.j2 b/dockers/docker-fpm-quagga/Dockerfile.j2 index 9d1312d073e..5ca6bf08826 100644 --- a/dockers/docker-fpm-quagga/Dockerfile.j2 +++ b/dockers/docker-fpm-quagga/Dockerfile.j2 @@ -7,7 +7,7 @@ RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%s ENV DEBIAN_FRONTEND=noninteractive # Update apt's cache of available packages -RUN apt-get update +RUN faketime "2022-11-01" apt-get update # Install required packages RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 libpython2.7 diff --git a/dockers/docker-fpm-quagga/base_image_files/rvtysh b/dockers/docker-fpm-quagga/base_image_files/rvtysh new file mode 120000 index 00000000000..3956b5bfb37 --- /dev/null +++ b/dockers/docker-fpm-quagga/base_image_files/rvtysh @@ -0,0 +1 @@ +../../docker-fpm-frr/base_image_files/rvtysh \ No newline at end of file diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index 1ffda3d1773..37d9c5072d9 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -1,15 +1,20 @@ #!/usr/bin/env bash mkdir -p /etc/quagga -sonic-cfggen -d -y /etc/sonic/constants.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf -sonic-cfggen -d -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/quagga/zebra.conf +CFGGEN_PARAMS=" \ + -d \ + -y /etc/sonic/constants.yml \ + -t /usr/share/sonic/templates/bgpd.conf.j2,/etc/quagga/bgpd.conf \ + -t /usr/share/sonic/templates/zebra.conf.j2,/etc/quagga/zebra.conf \ + -t /usr/share/sonic/templates/isolate.j2,/usr/sbin/bgp-isolate \ + -t /usr/share/sonic/templates/unisolate.j2,/usr/sbin/bgp-unisolate \ +" +sonic-cfggen $CFGGEN_PARAMS -sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -d -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate diff --git a/dockers/docker-fpm-quagga/supervisord.conf b/dockers/docker-fpm-quagga/supervisord.conf index 7397a7428a0..9c0df6bbc96 100644 --- a/dockers/docker-fpm-quagga/supervisord.conf +++ b/dockers/docker-fpm-quagga/supervisord.conf @@ -8,6 +8,7 @@ command=/usr/bin/supervisor-proc-exit-listener --container-name bgp events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected +buffer_size=1024 [program:start.sh] command=/usr/bin/start.sh diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index af2b0373c37..95ebefd2bae 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -37,6 +37,7 @@ RUN apt-get purge -y python-pip && \ COPY ["docker-lldp-init.sh", "/usr/bin/"] COPY ["start.sh", "/usr/bin/"] +COPY ["waitfor_lldp_ready.sh", "/usr/bin/"] COPY ["supervisord.conf.j2", "/usr/share/sonic/templates/"] COPY ["lldpd.conf.j2", "/usr/share/sonic/templates/"] COPY ["lldpd", "/etc/default/"] diff --git a/dockers/docker-lldp-sv2/base_image_files/monit_lldp b/dockers/docker-lldp-sv2/base_image_files/monit_lldp index 200c52c7d33..8dc2f3c1532 100644 --- a/dockers/docker-lldp-sv2/base_image_files/monit_lldp +++ b/dockers/docker-lldp-sv2/base_image_files/monit_lldp @@ -5,11 +5,11 @@ ## lldp-syncd ## lldpmgrd ############################################################################### -check process lldpd_monitor matching "lldpd: " - if does not exist for 5 times within 5 cycles then alert +check program lldp|lldpd_monitor with path "/usr/bin/process_checker lldp lldpd:" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process lldp_syncd matching "python2 -m lldp_syncd" - if does not exist for 5 times within 5 cycles then alert +check program lldp|lldp_syncd with path "/usr/bin/process_checker lldp python2 -m lldp_syncd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process lldpmgrd matching "python /usr/bin/lldpmgrd" - if does not exist for 5 times within 5 cycles then alert +check program lldp|lldpmgrd with path "/usr/bin/process_checker lldp python /usr/bin/lldpmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 index d5b6dba8700..904784ef67b 100644 --- a/dockers/docker-lldp-sv2/lldpd.conf.j2 +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -1,12 +1,21 @@ +{% set mgmt_if = {} %} {% if MGMT_INTERFACE %} +{% for (mgmt_name, mgmt_prefix) in MGMT_INTERFACE|pfx_filter %} +{% if mgmt_prefix|ipv4 %} +{% if mgmt_if.update({'port_name' : mgmt_name}) %} {% endif %} +{% if mgmt_if.update({'ipv4' : mgmt_prefix|ip}) %} {% endif %} +{% endif %} +{% endfor %} +{% endif %} +{% if mgmt_if %} {# If MGMT port alias is available, use it for port ID subtype, otherwise use port name #} -{% set mgmt_port_name = MGMT_INTERFACE.keys()[0][0] %} -{% set ipv4 = MGMT_INTERFACE.keys()[0][1].split('/')[0] %} -{% if MGMT_PORT and MGMT_PORT[mgmt_port_name] and MGMT_PORT[mgmt_port_name].alias %} -configure ports eth0 lldp portidsubtype local {{ MGMT_PORT[mgmt_port_name].alias }} +{% if MGMT_PORT and MGMT_PORT[mgmt_if.port_name] and MGMT_PORT[mgmt_if.port_name].alias %} +configure ports eth0 lldp portidsubtype local {{ MGMT_PORT[mgmt_if.port_name].alias }} {% else %} -configure ports eth0 lldp portidsubtype local {{ mgmt_port_name }} +configure ports eth0 lldp portidsubtype local {{ mgmt_if.port_name }} {% endif %} -configure system ip management pattern {{ ipv4 }} +configure system ip management pattern {{ mgmt_if.ipv4 }} {% endif %} configure system hostname {{ DEVICE_METADATA['localhost']['hostname'] }} +{# pause lldpd operations until all interfaces are well configured, resume command will run in lldpmgrd #} +pause diff --git a/dockers/docker-lldp-sv2/lldpmgrd b/dockers/docker-lldp-sv2/lldpmgrd index 7e9ef1642a0..5a421eb55cd 100755 --- a/dockers/docker-lldp-sv2/lldpmgrd +++ b/dockers/docker-lldp-sv2/lldpmgrd @@ -16,11 +16,13 @@ try: import os - import signal import subprocess import sys + import syslog import os.path + import time + from sonic_py_common import daemon_base from swsscommon import swsscommon except ImportError as err: raise ImportError("%s - required module not found" % str(err)) @@ -28,52 +30,10 @@ except ImportError as err: VERSION = "1.0" SYSLOG_IDENTIFIER = "lldpmgrd" +PORT_INIT_TIMEOUT = 300 -# ========================== Syslog wrappers ========================== - -def log_debug(msg): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_DEBUG, msg) - syslog.closelog() - - -def log_info(msg): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_INFO, msg) - syslog.closelog() - - -def log_warning(msg): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_WARNING, msg) - syslog.closelog() - - -def log_error(msg): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_ERR, msg) - syslog.closelog() - - -# ========================== Signal Handling ========================== - -def signal_handler(sig, frame): - if sig == signal.SIGHUP: - log_info("Caught SIGHUP - ignoring...") - return - elif sig == signal.SIGINT: - log_info("Caught SIGINT - exiting...") - sys.exit(128 + sig) - elif sig == signal.SIGTERM: - log_info("Caught SIGTERM - exiting...") - sys.exit(128 + sig) - else: - log_warning("Caught unhandled signal '" + sig + "'") - -# ============================== Classes ============================== - -class LldpManager(object): +class LldpManager(daemon_base.DaemonBase): """ Class which subscribes to notifications of changes in the PORT table of the Redis State database and updates LLDP configuration accordingly for @@ -86,7 +46,9 @@ class LldpManager(object): """ REDIS_TIMEOUT_MS = 0 - def __init__(self): + def __init__(self, log_identifier): + super(LldpManager, self).__init__(log_identifier) + # Open a handle to the Config database self.config_db = swsscommon.DBConnector("CONFIG_DB", self.REDIS_TIMEOUT_MS, @@ -114,12 +76,16 @@ class LldpManager(object): # Get the oper-status for the port if port_table_dict.has_key("oper_status"): port_oper_status = port_table_dict.get("oper_status") - log_info("Port name {} oper status: {}".format(port_name, port_oper_status)) + self.log_info("Port name {} oper status: {}".format(port_name, port_oper_status)) return port_oper_status == "up" else: return False else: - log_error("Port '{}' not found in {} table in App DB".format(port_name, swsscommon.APP_PORT_TABLE_NAME)) + # Retrieve PortInitDone entry from the Port table + (init_status, init_fvp) = port_table.get("PortInitDone") + #The initialization procedure is done, but don't have this port entry + if init_status: + self.log_error("Port '{}' not found in {} table in App DB".format(port_name, swsscommon.APP_PORT_TABLE_NAME)) return False def generate_pending_lldp_config_cmd_for_port(self, port_name): @@ -139,14 +105,14 @@ class LldpManager(object): # Get the port alias. If None or empty string, use port name instead port_alias = port_table_dict.get("alias") if not port_alias: - log_info("Unable to retrieve port alias for port '{}'. Using port name instead.".format(port_name)) + self.log_info("Unable to retrieve port alias for port '{}'. Using port name instead.".format(port_name)) port_alias = port_name # Get the port description. If None or empty string, we'll skip this configuration port_desc = port_table_dict.get("description") else: - log_error("Port '{}' not found in {} table in Config DB. Using port name instead of port alias.".format(port_name, swsscommon.CFG_PORT_TABLE_NAME)) + self.log_error("Port '{}' not found in {} table in Config DB. Using port name instead of port alias.".format(port_name, swsscommon.CFG_PORT_TABLE_NAME)) port_alias = port_name lldpcli_cmd = "lldpcli configure ports {0} lldp portidsubtype local {1}".format(port_name, port_alias) @@ -155,7 +121,7 @@ class LldpManager(object): if port_desc: lldpcli_cmd += " description '{}'".format(port_desc) else: - log_info("Unable to retrieve description for port '{}'. Not adding port description".format(port_name)) + self.log_info("Unable to retrieve description for port '{}'. Not adding port description".format(port_name)) # Add the command to our dictionary of pending commands, overwriting any # previous pending command for this port @@ -166,21 +132,19 @@ class LldpManager(object): to_delete = [] for (port_name, cmd) in self.pending_cmds.iteritems(): - log_debug("Running command: '{}'".format(cmd)) - - proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.log_debug("Running command: '{}'".format(cmd)) - (stdout, stderr) = proc.communicate() + rc, stderr = run_cmd(self, cmd) # If the command succeeds, add the port name to our to_delete list. # We will delete this command from self.pending_cmds below. # If the command fails, log a message, but don't delete the command # from self.pending_cmds, so that the command will be retried the # next time this method is called. - if proc.returncode == 0: + if rc == 0: to_delete.append(port_name) else: - log_warning("Command failed '{}': {}".format(cmd, stderr)) + self.log_warning("Command failed '{}': {}".format(cmd, stderr)) # Delete all successful commands from self.pending_cmds for port_name in to_delete: @@ -194,9 +158,23 @@ class LldpManager(object): Subscribe to CONFIG_DB - get notified of port config changes Update LLDP configuration accordingly. """ + self.log_info("Starting up...") + + if not os.geteuid() == 0: + self.log_error("Must be root to run this daemon") + print("Error: Must be root to run this daemon") + sys.exit(1) + # Set select timeout to 10 seconds SELECT_TIMEOUT_MS = 1000 * 10 + # Daemon is paused on the configuration file to avoid lldp packets with wrong information + # until all interfaces are well configured on lldpd + port_init_done = False + port_config_done = False + resume_lldp_sent = False + start_time = time.time() + sel = swsscommon.Select() # Subscribe to PORT table notifications in the Config DB @@ -235,28 +213,47 @@ class LldpManager(object): else: self.pending_cmds.pop(key, None) + elif key == "PortInitDone": + port_init_done = True + elif key == "PortConfigDone": + port_config_done = True + # Process all pending commands self.process_pending_cmds() + # Resume the daemon since all interfaces data updated and configured to the lldpd so no miss leading packets will be sent + if not resume_lldp_sent: + if check_timeout(self, start_time): + port_init_done = port_config_done = True + if port_init_done and port_config_done: + port_init_done = port_config_done = False + rc, stderr = run_cmd(self, "lldpcli resume") + if rc != 0: + self.log_error("Failed to resume lldpd with command: 'lldpcli resume': {}".format(stderr)) + sys.exit(1) + resume_lldp_sent = True # ============================= Functions ============================= def main(): - log_info("Starting up...") - - if not os.geteuid() == 0: - log_error("Must be root to run this daemon") - print "Error: Must be root to run this daemon" - sys.exit(1) + # Instantiate a LldpManager object + lldpmgr = LldpManager(SYSLOG_IDENTIFIER) - # Register our signal handlers - signal.signal(signal.SIGHUP, signal_handler) - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) + # Log all messages from INFO level and higher + lldpmgr.set_min_log_priority_info() - # Instantiate a LldpManager object - lldpmgr = LldpManager() lldpmgr.run() +def run_cmd(self, cmd): + proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout, stderr) = proc.communicate() + return proc.returncode, stderr + +def check_timeout(self, start_time): + if time.time() - start_time > PORT_INIT_TIMEOUT: + self.log_error("Port init timeout reached ({} seconds), resuming lldpd...".format(PORT_INIT_TIMEOUT)) + return True + return False + if __name__ == "__main__": main() diff --git a/dockers/docker-lldp-sv2/start.sh b/dockers/docker-lldp-sv2/start.sh index 76666e77aca..5cb6042cee5 100755 --- a/dockers/docker-lldp-sv2/start.sh +++ b/dockers/docker-lldp-sv2/start.sh @@ -5,34 +5,4 @@ sonic-cfggen -d -t /usr/share/sonic/templates/lldpd.conf.j2 > /etc/lldpd.conf mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status -rm -f /var/run/rsyslogd.pid rm -f /var/run/lldpd.socket - -supervisorctl start rsyslogd -supervisorctl start lldpd - -# Current lldpd version has a bug. -# When lldpd starts it is in the pause state by default -# But then it execute 'lldpcli resume' to configure and unpause itself. -# When lldpd execute lldpcli, it doesn't check the return code -# Sometimes lldpcli returns failure, but lldpd doesn't catch it -# and keeps working paused and unconfigured -# -# The fix below addresses the issue. -# - -# wait until lldpd started -until [[ -e /var/run/lldpd.socket ]]; -do - sleep 1; -done - -# Manually try to resume lldpd, until it's successful -while /bin/true; -do - lldpcli -u /var/run/lldpd.socket -c /etc/lldpd.conf -c /etc/lldpd.d resume > /dev/null && break - sleep 1 -done - -supervisorctl start lldp-syncd -supervisorctl start lldpmgrd diff --git a/dockers/docker-lldp-sv2/supervisord.conf.j2 b/dockers/docker-lldp-sv2/supervisord.conf.j2 index beae3aa9425..612305e8cc4 100644 --- a/dockers/docker-lldp-sv2/supervisord.conf.j2 +++ b/dockers/docker-lldp-sv2/supervisord.conf.j2 @@ -3,27 +3,41 @@ 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 +buffer_size=1024 + [eventlistener:supervisor-proc-exit-listener] command=/usr/bin/supervisor-proc-exit-listener --container-name lldp events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected +buffer_size=1024 -[program:start.sh] -command=/usr/bin/start.sh +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE priority=1 -autostart=true +autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n +[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:lldpd] # https://github.com/vincentbernat/lldpd/commit/9856f2792c301116cc4a3fcfba91b9672ee5db1f @@ -41,6 +55,19 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited + +[program:waitfor_lldp_ready] +command=/usr/bin/waitfor_lldp_ready.sh +priority=3 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=lldpd:running [program:lldp-syncd] command=/usr/bin/env python2 -m lldp_syncd @@ -49,6 +76,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=waitfor_lldp_ready:exited [program:lldpmgrd] command=/usr/bin/lldpmgrd @@ -57,3 +86,5 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=lldp-syncd:running diff --git a/dockers/docker-lldp-sv2/waitfor_lldp_ready.sh b/dockers/docker-lldp-sv2/waitfor_lldp_ready.sh new file mode 100755 index 00000000000..ecb16dc2e5f --- /dev/null +++ b/dockers/docker-lldp-sv2/waitfor_lldp_ready.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Current lldpd version has a bug. +# When lldpd starts it is in the pause state by default +# But then it execute 'lldpcli resume' to configure and unpause itself. +# When lldpd execute lldpcli, it doesn't check the return code +# Sometimes lldpcli returns failure, but lldpd doesn't catch it +# and keeps working paused and unconfigured +# +# The fix below addresses the issue. +# + +# wait until lldpd started +until [[ -e /var/run/lldpd.socket ]]; +do + sleep 1; +done + +# Manually try to resume lldpd, until it's successful +while /bin/true; +do + lldpcli -u /var/run/lldpd.socket -c /etc/lldpd.conf -c /etc/lldpd.d resume > /dev/null && break + sleep 1 +done diff --git a/dockers/docker-nat/restore_nat_entries.py b/dockers/docker-nat/restore_nat_entries.py index d07facab290..fc446f3655a 100755 --- a/dockers/docker-nat/restore_nat_entries.py +++ b/dockers/docker-nat/restore_nat_entries.py @@ -36,7 +36,7 @@ def add_nat_conntrack_entry_in_kernel(ipproto, srcip, dstip, srcport, dstport, n if (ipproto == IP_PROTO_TCP): state = ' --state ESTABLISHED ' ctcmd = 'conntrack -I -n ' + natdstip + ':' + natdstport + ' -g ' + natsrcip + ':' + natsrcport + \ - ' --protonum ' + ipproto + state + ' --timeout 600 --src ' + srcip + ' --sport ' + srcport + \ + ' --protonum ' + ipproto + state + ' --timeout 432000 --src ' + srcip + ' --sport ' + srcport + \ ' --dst ' + dstip + ' --dport ' + dstport + ' -u ASSURED' subprocess.call(ctcmd, shell=True) logger.info("Restored NAT entry: {}".format(ctcmd)) diff --git a/dockers/docker-nat/start.sh b/dockers/docker-nat/start.sh index e1f303fee6f..68603d007a5 100755 --- a/dockers/docker-nat/start.sh +++ b/dockers/docker-nat/start.sh @@ -1,15 +1,5 @@ #!/usr/bin/env bash -rm -f /var/run/rsyslogd.pid rm -f /var/run/nat/* mkdir -p /var/warmboot/nat - -supervisorctl start rsyslogd - -supervisorctl start natmgrd - -supervisorctl start natsyncd - -supervisorctl start restore_nat_entries - diff --git a/dockers/docker-nat/supervisord.conf b/dockers/docker-nat/supervisord.conf index 839d6f59ab3..7fb1ff3704c 100644 --- a/dockers/docker-nat/supervisord.conf +++ b/dockers/docker-nat/supervisord.conf @@ -3,27 +3,41 @@ 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 +buffer_size=1024 + [eventlistener:supervisor-proc-exit-listener] command=/usr/bin/supervisor-proc-exit-listener --container-name nat events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected +buffer_size=1024 -[program:start.sh] -command=/usr/bin/start.sh +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE priority=1 -autostart=true -autorestart=false +autostart=false +autorestart=unexpected stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n +[program:start] +command=/usr/bin/start.sh priority=2 autostart=false -autorestart=unexpected +autorestart=false +startsecs=0 stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running [program:natmgrd] command=/usr/bin/natmgrd @@ -32,6 +46,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=start:exited [program:natsyncd] command=/usr/bin/natsyncd @@ -40,6 +56,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=natmgrd:running [program:restore_nat_entries] command=/usr/bin/restore_nat_entries.py @@ -50,4 +68,5 @@ startsecs=0 startretries=0 stdout_logfile=syslog stderr_logfile=syslog - +dependent_startup=true +dependent_startup_wait_for=natsyncd:running diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index f95acd48fdb..5c3dc398866 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -21,6 +21,7 @@ RUN apt-get update && \ libelf1 \ libmnl0 \ bridge-utils \ + pciutils \ conntrack {% if ( CONFIGURED_ARCH == "armhf" or CONFIGURED_ARCH == "arm64" ) %} @@ -63,8 +64,9 @@ RUN apt-get clean -y && \ rm -rf /debs COPY ["files/arp_update", "/usr/bin"] +COPY ["arp_update.conf", "files/arp_update_vars.j2", "/usr/share/sonic/templates/"] COPY ["enable_counters.py", "/usr/bin"] -COPY ["start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] +COPY ["docker-init.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor/"] @@ -72,4 +74,4 @@ COPY ["critical_processes", "/etc/supervisor/"] ## Copy all Jinja2 template files into the templates folder COPY ["*.j2", "/usr/share/sonic/templates/"] -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/dockers/docker-orchagent/arp_update.conf b/dockers/docker-orchagent/arp_update.conf new file mode 100644 index 00000000000..a27a3b391cd --- /dev/null +++ b/dockers/docker-orchagent/arp_update.conf @@ -0,0 +1,9 @@ +[program:arp_update] +command=/usr/bin/arp_update +priority=7 +autostart=false +autorestart=unexpected +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited diff --git a/dockers/docker-orchagent/base_image_files/monit_swss b/dockers/docker-orchagent/base_image_files/monit_swss index 5928dbd4ddb..da601011e73 100644 --- a/dockers/docker-orchagent/base_image_files/monit_swss +++ b/dockers/docker-orchagent/base_image_files/monit_swss @@ -11,33 +11,33 @@ ## buffermgrd ## nbrmgrd ## vxlanmgrd -############################################################################### -check process orchagent matching "/usr/bin/orchagent -d /var/log/swss" - if does not exist for 5 times within 5 cycles then alert +############################################################################## +check program swss|orchagent with path "/usr/bin/process_checker swss /usr/bin/orchagent -d /var/log/swss" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process portsyncd matching "/usr/bin/portsyncd" - if does not exist for 5 times within 5 cycles then alert +check program swss|portsyncd with path "/usr/bin/process_checker swss /usr/bin/portsyncd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process neighsyncd matching "/usr/bin/neighsyncd" - if does not exist for 5 times within 5 cycles then alert +check program swss|neighsyncd with path "/usr/bin/process_checker swss /usr/bin/neighsyncd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process vrfmgrd matching "/usr/bin/vrfmgrd" - if does not exist for 5 times within 5 cycles then alert +check program swss|vrfmgrd with path "/usr/bin/process_checker swss /usr/bin/vrfmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process vlanmgrd matching "/usr/bin/vlanmgrd" - if does not exist for 5 times within 5 cycles then alert +check program swss|vlanmgrd with path "/usr/bin/process_checker swss /usr/bin/vlanmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process intfmgrd matching "/usr/bin/intfmgrd" - if does not exist for 5 times within 5 cycles then alert +check program swss|intfmgrd with path "/usr/bin/process_checker swss /usr/bin/intfmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process portmgrd matching "/usr/bin/portmgrd" - if does not exist for 5 times within 5 cycles then alert +check program swss|portmgrd with path "/usr/bin/process_checker swss /usr/bin/portmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process buffermgrd matching "/usr/bin/buffermgrd -l" - if does not exist for 5 times within 5 cycles then alert +check program swss|buffermgrd with path "/usr/bin/process_checker swss /usr/bin/buffermgrd -l" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process nbrmgrd matching "/usr/bin/nbrmgrd" - if does not exist for 5 times within 5 cycles then alert +check program swss|nbrmgrd with path "/usr/bin/process_checker swss /usr/bin/nbrmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process vxlanmgrd matching "/usr/bin/vxlanmgrd" - if does not exist for 5 times within 5 cycles then alert +check program swss|vxlanmgrd with path "/usr/bin/process_checker swss /usr/bin/vxlanmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles diff --git a/dockers/docker-orchagent/base_image_files/swssloglevel b/dockers/docker-orchagent/base_image_files/swssloglevel index d03685ed383..533bcb893a0 100755 --- a/dockers/docker-orchagent/base_image_files/swssloglevel +++ b/dockers/docker-orchagent/base_image_files/swssloglevel @@ -1,5 +1,13 @@ #!/bin/bash +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + +function help() +{ + echo -e "Usage: $0 -n [0 to $(($NUM_ASIC-1))] [OPTION]... " 1>&2; exit 1; +} + DOCKER_EXEC_FLAGS="i" # Determine whether stdout is on a terminal @@ -7,4 +15,30 @@ if [ -t 1 ] ; then DOCKER_EXEC_FLAGS+="t" fi -docker exec -$DOCKER_EXEC_FLAGS swss swssloglevel "$@" +DEV="" +PLATFORM=${PLATFORM:-`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`} + +# Parse the device specific asic conf file, if it exists +ASIC_CONF=/usr/share/sonic/device/$PLATFORM/asic.conf +[ -f $ASIC_CONF ] && . $ASIC_CONF + +if [[ ($NUM_ASIC -gt 1) ]]; then + while getopts ":n:h:" opt; do + case "${opt}" in + h) help + ;; + n) DEV=${OPTARG} + [ $DEV -lt $NUM_ASIC -a $DEV -ge 0 ] || help + ;; + esac + done + + if [ -z "${DEV}" ]; then + help + fi + + # Skip the arguments -n while passing to docker command + shift 2 +fi + +docker exec -$DOCKER_EXEC_FLAGS swss$DEV swssloglevel "$@" diff --git a/dockers/docker-orchagent/copp.json.j2 b/dockers/docker-orchagent/copp.json.j2 new file mode 100644 index 00000000000..49173a54e99 --- /dev/null +++ b/dockers/docker-orchagent/copp.json.j2 @@ -0,0 +1,85 @@ +[ + { + "COPP_TABLE:default": { + "queue": "0", + "meter_type":"packets", + "mode":"sr_tcm", + "cir":"600", + "cbs":"600", + "red_action":"drop" + }, + "OP": "SET" + }, + { + "COPP_TABLE:trap.group.bgp.lacp": { + "trap_ids": "bgp,bgpv6,lacp", + "trap_action":"trap", + "trap_priority":"4", + "queue": "4" + }, + "OP": "SET" + }, + { + "COPP_TABLE:trap.group.arp": { + "trap_ids": "arp_req,arp_resp,neigh_discovery", + "trap_action":"copy", + "trap_priority":"4", + "queue": "4", + "meter_type":"packets", + "mode":"sr_tcm", + "cir":"600", + "cbs":"600", + "red_action":"drop" + }, + "OP": "SET" + }, +{% if DEVICE_METADATA is defined and DEVICE_METADATA['localhost'] is defined and DEVICE_METADATA['localhost']['type'] is defined and DEVICE_METADATA['localhost']['type'] != "ToRRouter" %} + { + "COPP_TABLE:trap.group.lldp.udld": { + "trap_ids": "lldp,udld", + "trap_action":"trap", + "trap_priority":"4", + "queue": "4" + }, + "OP": "SET" + }, +{% else %} + { + "COPP_TABLE:trap.group.lldp.dhcp.dhcpv6.udld": { + "trap_ids": "lldp,dhcp,dhcpv6,udld", + "trap_action":"trap", + "trap_priority":"4", + "queue": "4" + }, + "OP": "SET" + }, +{% endif %} + { + "COPP_TABLE:trap.group.ip2me": { + "trap_ids": "ip2me", + "trap_action":"trap", + "trap_priority":"1", + "queue": "1", + "meter_type":"packets", + "mode":"sr_tcm", + "cir":"6000", + "cbs":"6000", + "red_action":"drop" + }, + "OP": "SET" + }, + { + "COPP_TABLE:trap.group.nat": { + "trap_ids": "src_nat_miss,dest_nat_miss", + "trap_action":"trap", + "trap_priority":"1", + "queue": "1", + "meter_type":"packets", + "mode":"sr_tcm", + "cir":"600", + "cbs":"600", + "red_action":"drop" + }, + "OP": "SET" + } +] diff --git a/dockers/docker-orchagent/docker-init.sh b/dockers/docker-orchagent/docker-init.sh new file mode 100755 index 00000000000..7f6674c0b64 --- /dev/null +++ b/dockers/docker-orchagent/docker-init.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +mkdir -p /etc/swss/config.d/ + +CFGGEN_PARAMS=" \ + -d \ + -y /etc/sonic/constants.yml \ + -t /usr/share/sonic/templates/switch.json.j2,/etc/swss/config.d/switch.json \ + -t /usr/share/sonic/templates/ipinip.json.j2,/etc/swss/config.d/ipinip.json \ + -t /usr/share/sonic/templates/ports.json.j2,/etc/swss/config.d/ports.json \ + -t /usr/share/sonic/templates/copp.json.j2,/etc/swss/config.d/00-copp.config.json \ + -t /usr/share/sonic/templates/vlan_vars.j2 \ +" +VLAN=$(sonic-cfggen $CFGGEN_PARAMS) + +# Executed platform specific initialization tasks. +if [ -x /usr/share/sonic/platform/platform-init ]; then + /usr/share/sonic/platform/platform-init +fi + +# Executed HWSKU specific initialization tasks. +if [ -x /usr/share/sonic/hwsku/hwsku-init ]; then + /usr/share/sonic/hwsku/hwsku-init +fi + +# Start arp_update when VLAN exists +if [ "$VLAN" != "" ]; then + cp /usr/share/sonic/templates/arp_update.conf /etc/supervisor/conf.d/ +fi + +exec /usr/bin/supervisord diff --git a/dockers/docker-orchagent/enable_counters.py b/dockers/docker-orchagent/enable_counters.py index 75f8ef82cb4..32b9a6211c7 100755 --- a/dockers/docker-orchagent/enable_counters.py +++ b/dockers/docker-orchagent/enable_counters.py @@ -4,9 +4,12 @@ import time def enable_counter_group(db, name): - info = {} - info['FLEX_COUNTER_STATUS'] = 'enable' - db.mod_entry("FLEX_COUNTER_TABLE", name, info) + entry_info = db.get_entry("FLEX_COUNTER_TABLE", name) + + if not entry_info: + info = {} + info['FLEX_COUNTER_STATUS'] = 'enable' + db.mod_entry("FLEX_COUNTER_TABLE", name, info) def enable_counters(): db = swsssdk.ConfigDBConnector() @@ -15,7 +18,12 @@ def enable_counters(): enable_counter_group(db, 'QUEUE') enable_counter_group(db, 'PFCWD') enable_counter_group(db, 'PG_WATERMARK') + enable_counter_group(db, 'PG_DROP') enable_counter_group(db, 'QUEUE_WATERMARK') + enable_counter_group(db, 'BUFFER_POOL_WATERMARK') + enable_counter_group(db, 'PORT_BUFFER_DROP') + if 'mlnx' in db.get_table('DEVICE_METADATA')['localhost'].get('platform'): + enable_counter_group(db, 'RIF') def get_uptime(): with open('/proc/uptime') as fp: diff --git a/dockers/docker-orchagent/ipinip.json.j2 b/dockers/docker-orchagent/ipinip.json.j2 index 66bec75da7d..d0eafb2206f 100644 --- a/dockers/docker-orchagent/ipinip.json.j2 +++ b/dockers/docker-orchagent/ipinip.json.j2 @@ -2,12 +2,17 @@ {% set ipv6_addresses = [] %} {% set ipv4_loopback_addresses = [] %} {% set ipv6_loopback_addresses = [] %} +{% if DEVICE_METADATA['localhost']['sub_role'] == 'FrontEnd' or DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd'%} +{% set loopback_intf_names = ['Loopback0', 'Loopback4096'] %} +{% else %} +{% set loopback_intf_names = ['Loopback0'] %} +{% endif %} {% for (name, prefix) in LOOPBACK_INTERFACE|pfx_filter %} - {%- if prefix | ipv4 and name == 'Loopback0' %} + {%- if prefix | ipv4 and name in loopback_intf_names %} {%- set ipv4_addresses = ipv4_addresses.append(prefix) %} {%- set ipv4_loopback_addresses = ipv4_loopback_addresses.append(prefix) %} {%- endif %} - {%- if prefix | ipv6 and name == 'Loopback0' %} + {%- if prefix | ipv6 and name in loopback_intf_names %} {%- set ipv6_addresses = ipv6_addresses.append(prefix) %} {%- set ipv6_loopback_addresses = ipv6_loopback_addresses.append(prefix) %} {%- endif %} diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index a96d355ac39..81ab1df8aa7 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -1,10 +1,18 @@ #!/usr/bin/env bash -# Export platform information. Required to be able to write -# vendor specific code. -export platform=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` +EXIT_SWSS_VARS_FILE_NOT_FOUND=1 +SWSS_VARS_FILE=/usr/share/sonic/templates/swss_vars.j2 -MAC_ADDRESS=$(sonic-cfggen -d -v 'DEVICE_METADATA.localhost.mac') +if [ ! -f "$SWSS_VARS_FILE" ]; then + echo "SWSS vars template file not found" + exit $EXIT_SWSS_VARS_FILE_NOT_FOUND +fi + +# Retrieve SWSS vars from sonic-cfggen +SWSS_VARS=$(sonic-cfggen -d -y /etc/sonic/sonic_version.yml -t $SWSS_VARS_FILE) +export platform=$(echo $SWSS_VARS | jq -r '.asic_type') + +MAC_ADDRESS=$(echo $SWSS_VARS | jq -r '.mac') if [ "$MAC_ADDRESS" == "None" ] || [ -z "$MAC_ADDRESS" ]; then MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') logger "Mac address not found in Device Metadata, Falling back to eth0" @@ -27,12 +35,17 @@ ORCHAGENT_ARGS+="-b 8192 " # ID field could be integers just to denote the asic instance like 0,1,2... # OR could be PCI device ID's which will be strings like "03:00.0" # depending on what the SAI/SDK expects. -asic_id=`sonic-cfggen -d -v DEVICE_METADATA.localhost.asic_id` +asic_id=$(echo $SWSS_VARS | jq -r '.asic_id') if [ -n "$asic_id" ] then ORCHAGENT_ARGS+="-i $asic_id " fi +# for multi asic platforms add the asic name to the record file names +if [[ "$NAMESPACE_ID" ]]; then + ORCHAGENT_ARGS+="-f swss.asic$NAMESPACE_ID.rec -j sairedis.asic$NAMESPACE_ID.rec " +fi + # Add platform specific arguments if necessary if [ "$platform" == "broadcom" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" @@ -54,7 +67,7 @@ elif [ "$platform" == "mellanox" ]; then elif [ "$platform" == "innovium" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" else - MAC_ADDRESS=`sonic-cfggen -d -v 'DEVICE_METADATA.localhost.mac'` + # Should we use the fallback MAC in case it is not found in Device.Metadata ORCHAGENT_ARGS+="-m $MAC_ADDRESS" fi diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh deleted file mode 100755 index b7357ad58f6..00000000000 --- a/dockers/docker-orchagent/start.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -mkdir -p /etc/swss/config.d/ - -sonic-cfggen -d -y /etc/sonic/sonic_version.yml -t /usr/share/sonic/templates/switch.json.j2 > /etc/swss/config.d/switch.json -sonic-cfggen -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json -sonic-cfggen -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json - -# Executed HWSKU specific initialization tasks. -if [ -x /usr/share/sonic/hwsku/hwsku-init ]; then - /usr/share/sonic/hwsku/hwsku-init -fi - -export platform=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform` - -rm -f /var/run/rsyslogd.pid - -supervisorctl start rsyslogd - -supervisorctl start orchagent - -supervisorctl start restore_neighbors - -supervisorctl start portsyncd - -supervisorctl start neighsyncd - -supervisorctl start swssconfig - -supervisorctl start vrfmgrd - -supervisorctl start vlanmgrd - -supervisorctl start intfmgrd - -supervisorctl start portmgrd - -supervisorctl start buffermgrd - -supervisorctl start enable_counters - -supervisorctl start nbrmgrd - -supervisorctl start vxlanmgrd - -# Start arp_update when VLAN exists -VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` -if [ "$VLAN" != "" ]; then - supervisorctl start arp_update -fi diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf index 6b21d73f3c8..a680d7a3295 100644 --- a/dockers/docker-orchagent/supervisord.conf +++ b/dockers/docker-orchagent/supervisord.conf @@ -3,69 +3,84 @@ 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 +buffer_size=1024 + [eventlistener:supervisor-proc-exit-listener] command=/usr/bin/supervisor-proc-exit-listener --container-name swss events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected - -[program:start.sh] -command=/usr/bin/start.sh -priority=1 -autostart=true -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog +buffer_size=1024 [program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=2 +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 autostart=false autorestart=unexpected stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true -[program:orchagent] -command=/usr/bin/orchagent.sh +[program:portsyncd] +command=/usr/bin/portsyncd priority=3 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running -[program:portsyncd] -command=/usr/bin/portsyncd +[program:orchagent] +command=/usr/bin/orchagent.sh priority=4 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=portsyncd:running -[program:neighsyncd] -command=/usr/bin/neighsyncd +[program:swssconfig] +command=/usr/bin/swssconfig.sh priority=5 autostart=false -autorestart=false +autorestart=unexpected +startretries=0 +startsecs=0 stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=orchagent:running -[program:swssconfig] -command=/usr/bin/swssconfig.sh +[program:restore_neighbors] +command=/usr/bin/restore_neighbors.py priority=6 autostart=false -autorestart=unexpected -startretries=0 +autorestart=false startsecs=0 +startretries=0 stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited -[program:arp_update] -command=/usr/bin/arp_update +[program:neighsyncd] +command=/usr/bin/neighsyncd priority=7 autostart=false -autorestart=unexpected +autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited [program:vlanmgrd] command=/usr/bin/vlanmgrd @@ -74,6 +89,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited [program:intfmgrd] command=/usr/bin/intfmgrd @@ -82,6 +99,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited [program:portmgrd] command=/usr/bin/portmgrd @@ -90,6 +109,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited [program:buffermgrd] command=/usr/bin/buffermgrd -l /usr/share/sonic/hwsku/pg_profile_lookup.ini @@ -98,14 +119,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - -[program:enable_counters] -command=/usr/bin/enable_counters.py -priority=12 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited [program:vrfmgrd] command=/usr/bin/vrfmgrd @@ -114,16 +129,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - -[program:restore_neighbors] -command=/usr/bin/restore_neighbors.py -priority=14 -autostart=false -autorestart=false -startsecs=0 -startretries=0 -stdout_logfile=syslog -stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited [program:nbrmgrd] command=/usr/bin/nbrmgrd @@ -132,6 +139,8 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited [program:vxlanmgrd] command=/usr/bin/vxlanmgrd @@ -140,3 +149,15 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited + +[program:enable_counters] +command=/usr/bin/enable_counters.py +priority=12 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=swssconfig:exited diff --git a/dockers/docker-orchagent/switch.json.j2 b/dockers/docker-orchagent/switch.json.j2 index f8beffbc9ad..4d2a0be1b05 100644 --- a/dockers/docker-orchagent/switch.json.j2 +++ b/dockers/docker-orchagent/switch.json.j2 @@ -1,20 +1,25 @@ {# the range of hash_seed is 0-15 #} {# set default hash seed to 0 #} {% set hash_seed = 0 %} +{% set hash_seed_offset = 0 %} {% if DEVICE_METADATA.localhost.type %} -{% if DEVICE_METADATA.localhost.type == "ToRRouter" %} +{% if "ToRRouter" in DEVICE_METADATA.localhost.type %} {% set hash_seed = 0 %} -{% elif DEVICE_METADATA.localhost.type == "LeafRouter" %} +{% elif "LeafRouter" in DEVICE_METADATA.localhost.type %} {% set hash_seed = 10 %} -{% elif DEVICE_METADATA.localhost.type == "SpineRouter" %} -{% set hash_seed = 15 %} +{% elif "SpineRouter" in DEVICE_METADATA.localhost.type %} +{% set hash_seed = 25 %} {% endif %} {% endif %} +{% if DEVICE_METADATA.localhost.namespace_id %} +{% set hash_seed_offset = DEVICE_METADATA.localhost.namespace_id | int %} +{% endif %} +{% set hash_seed_value = hash_seed_offset + hash_seed %} [ { "SWITCH_TABLE:switch": { - "ecmp_hash_seed": "{{ hash_seed }}", - "lag_hash_seed": "{{ hash_seed }}", + "ecmp_hash_seed": "{{ hash_seed_value }}", + "lag_hash_seed": "{{ hash_seed_value }}", "fdb_aging_time": "600" }, "OP": "SET" diff --git a/dockers/docker-orchagent/swss_vars.j2 b/dockers/docker-orchagent/swss_vars.j2 new file mode 100644 index 00000000000..0a0b2712f46 --- /dev/null +++ b/dockers/docker-orchagent/swss_vars.j2 @@ -0,0 +1,6 @@ +{ + "asic_type": "{{ asic_type }}", + "asic_id": "{{ DEVICE_METADATA.localhost.asic_id }}", + "mac": "{{ DEVICE_METADATA.localhost.mac }}" +} + diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 0743d95f8eb..276132a7ef2 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -39,18 +39,17 @@ rm -f /ready # Restore FDB and ARP table ASAP fast_reboot -HWSKU=`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['hwsku']"` +# read SONiC immutable variables +[ -f /etc/sonic/sonic-environment ] && . /etc/sonic/sonic-environment + +HWSKU=${HWSKU:-`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['hwsku']"`} # Don't load json config if system warm start or # swss docker warm start is enabled, the data already exists in appDB. SYSTEM_WARM_START=`sonic-db-cli STATE_DB hget "WARM_RESTART_ENABLE_TABLE|system" enable` SWSS_WARM_START=`sonic-db-cli STATE_DB hget "WARM_RESTART_ENABLE_TABLE|swss" enable` if [[ "$SYSTEM_WARM_START" == "true" ]] || [[ "$SWSS_WARM_START" == "true" ]]; then - # We have to make sure db data has not been flushed. - RESTORE_COUNT=`sonic-db-cli STATE_DB hget "WARM_RESTART_TABLE|orchagent" restore_count` - if [[ -n "$RESTORE_COUNT" ]] && [[ "$RESTORE_COUNT" != "0" ]]; then - exit 0 - fi + exit 0 fi SWSSCONFIG_ARGS="00-copp.config.json ipinip.json ports.json switch.json " diff --git a/dockers/docker-orchagent/vlan_vars.j2 b/dockers/docker-orchagent/vlan_vars.j2 new file mode 100644 index 00000000000..55db548043a --- /dev/null +++ b/dockers/docker-orchagent/vlan_vars.j2 @@ -0,0 +1 @@ +{%- if VLAN -%}{{- VLAN.keys() | join(' ') -}}{%- endif -%} diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 2ce609fff17..b9005f0859b 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -56,10 +56,14 @@ RUN apt-get purge -y \ /python-wheels \ ~/.cache -COPY ["docker_init.sh", "lm-sensors.sh", "/usr/bin/"] -COPY ["docker-pmon.supervisord.conf.j2", "start.sh.j2", "/usr/share/sonic/templates/"] +COPY ["lm-sensors.sh", "start.sh", "/usr/bin/"] +COPY ["docker-pmon.supervisord.conf.j2", "docker_init.j2", "/usr/share/sonic/templates/"] COPY ["ssd_tools/*", "/usr/bin/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] +RUN sonic-cfggen -a "{\"CONFIGURED_PLATFORM\":\"{{CONFIGURED_PLATFORM}}\"}" -t /usr/share/sonic/templates/docker_init.j2 > /usr/bin/docker_init.sh +RUN rm -f /usr/share/sonic/templates/docker_init.j2 +RUN chmod 755 /usr/bin/docker_init.sh + ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-platform-monitor/base_image_files/monit_pmon.j2 b/dockers/docker-platform-monitor/base_image_files/monit_pmon.j2 new file mode 100644 index 00000000000..536cf76cd36 --- /dev/null +++ b/dockers/docker-platform-monitor/base_image_files/monit_pmon.j2 @@ -0,0 +1,61 @@ +{# This template file is used to generate Monit configuration file of platform monitor container -#} + +############################################################################### +## Monit configuration file for PMon container +## process list: +{% if not skip_fancontrol and HAVE_FANCONTROL_CONF == 1 %} +## fancontrol +{% endif %} +{% if not skip_ledd %} +## ledd +{% endif %} +{% if not skip_psud %} +## psud +{% endif %} +{% if not skip_sensors and HAVE_SENSORS_CONF == 1 %} +## sensord +{% endif %} +{% if not skip_syseepromd %} +## syseepromd +{% endif %} +{% if not skip_thermalctld %} +## thermalctld +{% endif %} +{% if not skip_xcvrd %} +## xcvrd +{% endif %} +############################################################################### +{% if not skip_fancontrol and HAVE_FANCONTROL_CONF == 1 %} +check program pmon|fancontrol with path "/usr/bin/process_checker pmon /bin/bash /usr/sbin/fancontrol" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{% endif %} + +{% if not skip_ledd %} +check program pmon|ledd with path "/usr/bin/process_checker pmon /usr/bin/python /usr/bin/ledd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{% endif %} + +{% if not skip_psud %} +check program pmon|psud with path "/usr/bin/process_checker pmon /usr/bin/python /usr/bin/psud" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{% endif %} + +{% if not skip_sensors and HAVE_SENSORS_CONF == 1 %} +check program pmon|sensord with path "/usr/bin/process_checker pmon /usr/sbin/sensord -f daemon" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{% endif %} + +{% if not skip_syseepromd %} +check program pmon|syseepromd with path "/usr/bin/process_checker pmon /usr/bin/python /usr/bin/syseepromd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{% endif %} + +{% if not skip_thermalctld %} +check program pmon|thermalctld with path "/usr/bin/process_checker pmon /usr/bin/python /usr/bin/thermalctld" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{% endif %} + +{% if not skip_xcvrd %} +check program pmon|xcvrd with path "/usr/bin/process_checker pmon /usr/bin/python /usr/bin/xcvrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{%- endif -%} diff --git a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 index d33b4e7c3fe..5b9abad2cf1 100644 --- a/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 +++ b/dockers/docker-platform-monitor/docker-pmon.supervisord.conf.j2 @@ -3,30 +3,43 @@ 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 +buffer_size=1024 + [eventlistener:supervisor-proc-exit-listener] command=/usr/bin/supervisor-proc-exit-listener --container-name pmon events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected +buffer_size=1024 -[program:start.sh] -command=/usr/bin/start.sh +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE priority=1 -autostart=true +autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog -startsecs=0 +dependent_startup=true -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n +[program:start] +command=/usr/bin/start.sh priority=2 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +startsecs=0 +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running -{% if not skip_sensors %} +{% if not skip_sensors and HAVE_SENSORS_CONF == 1 %} [program:lm-sensors] command=/usr/bin/lm-sensors.sh priority=3 @@ -35,9 +48,11 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog startsecs=0 +dependent_startup=true +dependent_startup_wait_for=start:exited {% endif %} -{% if not skip_fancontrol %} +{% if not skip_fancontrol and HAVE_FANCONTROL_CONF == 1 %} [program:fancontrol] command=/usr/sbin/fancontrol priority=4 @@ -46,6 +61,8 @@ autorestart=unexpected stdout_logfile=syslog stderr_logfile=syslog startsecs=10 +dependent_startup=true +dependent_startup_wait_for=start:exited {% endif %} {% if not skip_ledd %} @@ -57,17 +74,25 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog startsecs=0 +dependent_startup=true +dependent_startup_wait_for=start:exited {% endif %} {% if not skip_xcvrd %} [program:xcvrd] +{% if delay_xcvrd %} +command=bash -c "sleep 30 && /usr/bin/xcvrd" +{% else %} command=/usr/bin/xcvrd +{% endif %} priority=6 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog startsecs=0 +dependent_startup=true +dependent_startup_wait_for=start:exited {% endif %} {% if not skip_psud %} @@ -79,6 +104,8 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog startsecs=0 +dependent_startup=true +dependent_startup_wait_for=start:exited {% endif %} {% if not skip_syseepromd %} @@ -90,6 +117,8 @@ autorestart=unexpected stdout_logfile=syslog stderr_logfile=syslog startsecs=10 +dependent_startup=true +dependent_startup_wait_for=start:exited {% endif %} {% if not skip_thermalctld %} @@ -100,5 +129,8 @@ autostart=false autorestart=true stdout_logfile=syslog stderr_logfile=syslog -startsecs=0 +startsecs=10 +startretries=50 +dependent_startup=true +dependent_startup_wait_for=start:exited {% endif %} diff --git a/dockers/docker-platform-monitor/docker_init.j2 b/dockers/docker-platform-monitor/docker_init.j2 new file mode 100755 index 00000000000..c5d9fca78c4 --- /dev/null +++ b/dockers/docker-platform-monitor/docker_init.j2 @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +# Generate supervisord config file and the start.sh scripts +mkdir -p /etc/supervisor/conf.d/ + +SENSORS_CONF_FILE="/usr/share/sonic/platform/sensors.conf" +FANCONTROL_CONF_FILE="/usr/share/sonic/platform/fancontrol" + +HAVE_SENSORS_CONF=0 +HAVE_FANCONTROL_CONF=0 + +{% if CONFIGURED_PLATFORM == "mellanox" %} +SENSORS_CONF_PATH_GETTER="/usr/share/sonic/platform/get_sensors_conf_path" +if [ -e $SENSORS_CONF_PATH_GETTER ]; then + SENSORS_CONF_FILE=$($SENSORS_CONF_PATH_GETTER 2>&1) +fi +{% endif %} + +if [ -e $SENSORS_CONF_FILE ]; then + HAVE_SENSORS_CONF=1 +fi + +if [ -e $FANCONTROL_CONF_FILE ]; then + HAVE_FANCONTROL_CONF=1 +fi + +confvar="{\"HAVE_SENSORS_CONF\":$HAVE_SENSORS_CONF, \"HAVE_FANCONTROL_CONF\":$HAVE_FANCONTROL_CONF}" + +if [ -e /usr/share/sonic/platform/pmon_daemon_control.json ]; +then + sonic-cfggen -j /usr/share/sonic/platform/pmon_daemon_control.json -a "$confvar" -t /usr/share/sonic/templates/docker-pmon.supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf +else + sonic-cfggen -a "$confvar" -t /usr/share/sonic/templates/docker-pmon.supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf +fi + +# If this platform has an lm-sensors config file, copy it to its proper place +if [ $HAVE_SENSORS_CONF -eq 1 ]; then + mkdir -p /etc/sensors.d + /bin/cp -f $SENSORS_CONF_FILE /etc/sensors.d/sensors.conf +fi + +# If this platform has a fancontrol config file, copy it to its proper place +if [ $HAVE_FANCONTROL_CONF -eq 1 ]; then + # Remove stale pid file if it exists + rm -f /var/run/fancontrol.pid + + /bin/cp -f $FANCONTROL_CONF_FILE /etc/ +fi + +exec /usr/bin/supervisord diff --git a/dockers/docker-platform-monitor/docker_init.sh b/dockers/docker-platform-monitor/docker_init.sh deleted file mode 100755 index a2be49f49dd..00000000000 --- a/dockers/docker-platform-monitor/docker_init.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# Generate supervisord config file and the start.sh scripts -mkdir -p /etc/supervisor/conf.d/ - -if [ -e /usr/share/sonic/platform/pmon_daemon_control.json ]; -then - sonic-cfggen -j /usr/share/sonic/platform/pmon_daemon_control.json -t /usr/share/sonic/templates/docker-pmon.supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf - sonic-cfggen -j /usr/share/sonic/platform/pmon_daemon_control.json -t /usr/share/sonic/templates/start.sh.j2 > /usr/bin/start.sh - chmod +x /usr/bin/start.sh -else - sonic-cfggen -t /usr/share/sonic/templates/docker-pmon.supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf - sonic-cfggen -t /usr/share/sonic/templates/start.sh.j2 > /usr/bin/start.sh - chmod +x /usr/bin/start.sh -fi - -exec /usr/bin/supervisord - diff --git a/dockers/docker-platform-monitor/start.sh b/dockers/docker-platform-monitor/start.sh new file mode 100755 index 00000000000..58e481476b9 --- /dev/null +++ b/dockers/docker-platform-monitor/start.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +declare -r EXIT_SUCCESS="0" + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status + +# If this platform has synchronization script, run it +if [ -e /usr/share/sonic/platform/platform_wait ]; then + /usr/share/sonic/platform/platform_wait + EXIT_CODE="$?" + if [ "${EXIT_CODE}" != "${EXIT_SUCCESS}" ]; then + supervisorctl shutdown + exit "${EXIT_CODE}" + fi +fi + +# If the sonic-platform package is not installed, try to install it +pip show sonic-platform > /dev/null 2>&1 +if [ $? -ne 0 ]; then + SONIC_PLATFORM_WHEEL="/usr/share/sonic/platform/sonic_platform-1.0-py2-none-any.whl" + echo "sonic-platform package not installed, attempting to install..." + if [ -e ${SONIC_PLATFORM_WHEEL} ]; then + pip install ${SONIC_PLATFORM_WHEEL} + if [ $? -eq 0 ]; then + echo "Successfully installed ${SONIC_PLATFORM_WHEEL}" + else + echo "Error: Failed to install ${SONIC_PLATFORM_WHEEL}" + fi + else + echo "Error: Unable to locate ${SONIC_PLATFORM_WHEEL}" + fi +fi diff --git a/dockers/docker-platform-monitor/start.sh.j2 b/dockers/docker-platform-monitor/start.sh.j2 deleted file mode 100644 index 03e0b49b8c4..00000000000 --- a/dockers/docker-platform-monitor/start.sh.j2 +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash - -declare -r EXIT_SUCCESS="0" - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status - -rm -f /var/run/rsyslogd.pid - -supervisorctl start rsyslogd - -# If this platform has synchronization script, run it -if [ -e /usr/share/sonic/platform/platform_wait ]; then - /usr/share/sonic/platform/platform_wait - EXIT_CODE="$?" - if [ "${EXIT_CODE}" != "${EXIT_SUCCESS}" ]; then - supervisorctl shutdown - exit "${EXIT_CODE}" - fi -fi - -{% if not skip_sensors %} -# If this platform has an lm-sensors config file, copy it to it's proper place -# and start lm-sensors -if [ -e /usr/share/sonic/platform/sensors.conf ]; then - mkdir -p /etc/sensors.d - /bin/cp -f /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ - supervisorctl start lm-sensors -fi -{% endif %} - -{% if not skip_fancontrol %} -# If this platform has a fancontrol config file, copy it to it's proper place -# and start fancontrol -if [ -e /usr/share/sonic/platform/fancontrol ]; then - # Remove stale pid file if it exists - rm -f /var/run/fancontrol.pid - - /bin/cp -f /usr/share/sonic/platform/fancontrol /etc/ - supervisorctl start fancontrol -fi -{% endif %} - - -# If the sonic-platform package is not installed, try to install it -pip show sonic-platform > /dev/null 2>&1 -if [ $? -ne 0 ]; then - SONIC_PLATFORM_WHEEL="/usr/share/sonic/platform/sonic_platform-1.0-py2-none-any.whl" - echo "sonic-platform package not installed, attempting to install..." - if [ -e ${SONIC_PLATFORM_WHEEL} ]; then - pip install ${SONIC_PLATFORM_WHEEL} - if [ $? -eq 0 ]; then - echo "Successfully installed ${SONIC_PLATFORM_WHEEL}" - else - echo "Error: Failed to install ${SONIC_PLATFORM_WHEEL}" - fi - else - echo "Error: Unable to locate ${SONIC_PLATFORM_WHEEL}" - fi -fi - -{% if not skip_ledd %} -supervisorctl start ledd -{% endif %} - -{% if not skip_xcvrd %} -supervisorctl start xcvrd -{% endif %} - -{% if not skip_psud %} -supervisorctl start psud -{% endif %} - -{% if not skip_syseepromd %} -supervisorctl start syseepromd -{% endif %} - -{% if not skip_thermalctld %} -supervisorctl start thermalctld -{% endif %} - diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 006a6c5d35f..76f570a9df5 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -1,13 +1,18 @@ +{% set prefix = DEFAULT_CONTAINER_REGISTRY %} {% if CONFIGURED_ARCH == "armhf" %} -FROM multiarch/debian-debootstrap:armhf-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:armhf-stretch {% elif CONFIGURED_ARCH == "arm64" %} -FROM multiarch/debian-debootstrap:arm64-stretch +FROM {{ prefix }}multiarch/debian-debootstrap:arm64-stretch {% else %} -FROM debian:stretch +FROM {{ prefix }}debian:stretch {% endif %} MAINTAINER Pavel Shirshov +# Configure the debian mirrors +COPY ["sources.list.{{ CONFIGURED_ARCH }}", "/etc/apt/sources.list"] +COPY ["no-check-valid-until", "/etc/apt/apt.conf.d"] + ## Remove retired jessie-updates repo RUN sed -i '/deb http:\/\/deb.debian.org\/debian jessie-updates main/d' /etc/apt/sources.list @@ -22,6 +27,7 @@ debs/ ENV DEBIAN_FRONTEND=noninteractive ## Set the apt source, update package cache and install necessary packages +## TODO: Clean up this step RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' /etc/apt/sources.list \ && apt-get update \ && apt-get upgrade -y \ @@ -38,7 +44,6 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / unzip \ pkg-config \ binutils \ - net-tools \ build-essential \ libssl-dev \ libffi-dev \ @@ -52,7 +57,6 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / iputils-ping \ hping3 \ curl \ - tcpdump \ tmux \ python \ python-dev \ @@ -63,7 +67,11 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / rsyslog \ ntp \ ntpstat \ - ntpdate + ntpdate \ + arping \ + bridge-utils \ + libteam-utils + RUN dpkg -i \ {% for deb in docker_ptf_debs.split(' ') -%} @@ -71,11 +79,12 @@ debs/{{ deb }}{{' '}} {%- endfor %} # Install all python modules from pypi. python-scapy is exception, ptf debian package requires python-scapy +# TODO: Clean up this step RUN rm -rf /debs \ && apt-get -y autoclean \ && apt-get -y autoremove \ && rm -rf /var/lib/apt/lists/* \ - && wget --https-only https://bootstrap.pypa.io/get-pip.py \ + && wget --https-only https://bootstrap.pypa.io/pip/2.7/get-pip.py \ && python get-pip.py \ && rm -f get-pip.py \ && pip install setuptools \ @@ -106,6 +115,7 @@ RUN rm -rf /debs \ && pip install flask \ && pip install exabgp==3.4.17\ && pip install pyaml \ + && pip install pybrctl pyro4 rpyc yabgp \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py @@ -117,8 +127,9 @@ RUN mkdir /var/run/sshd \ && sed -ri '/^#?UsePAM/c\UsePAM no' /etc/ssh/sshd_config \ && sed -ri '/^#?UseDNS/c\UseDNS no' /etc/ssh/sshd_config -COPY ["supervisord.conf", "/etc/supervisor/"] -COPY ["conf.d/supervisord.conf", "conf.d/sshd.conf", "conf.d/ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] +COPY supervisord.conf /etc/supervisor/ +COPY conf.d/ /etc/supervisor/conf.d/ +COPY ptf_tgen.sh /ptf_tgen/ # Move tcpdump into /usr/bin Otherwise it's impossible to run tcpdump due to a docker bug RUN mv /usr/sbin/tcpdump /usr/bin/tcpdump @@ -126,6 +137,13 @@ RUN ln -s /usr/bin/tcpdump /usr/sbin/tcpdump RUN mkdir -p /var/log/supervisor -EXPOSE 22 +# Install Python-based GNMI client +RUN git clone https://github.com/lguohan/gnxi.git \ + && cd gnxi \ + && git checkout d01b36e \ + && cd gnmi_cli_py \ + && pip install -r requirements.txt + +EXPOSE 22 8009 ENTRYPOINT ["/usr/local/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/dockers/docker-ptf/conf.d/ptf_tgen.conf b/dockers/docker-ptf/conf.d/ptf_tgen.conf new file mode 100644 index 00000000000..8efd3f1c15f --- /dev/null +++ b/dockers/docker-ptf/conf.d/ptf_tgen.conf @@ -0,0 +1,10 @@ +[program:ptf_tgen] +command=/ptf_tgen/ptf_tgen.sh +process_name=ptf_tgen +stdout_logfile=/tmp/ptf_tgen.out.log +stderr_logfile=/tmp/ptf_tgen.err.log +redirect_stderr=false +autostart=false +autorestart=true +startsecs=1 +numprocs=1 diff --git a/dockers/docker-ptf/no-check-valid-until b/dockers/docker-ptf/no-check-valid-until new file mode 100644 index 00000000000..c7c25d017f7 --- /dev/null +++ b/dockers/docker-ptf/no-check-valid-until @@ -0,0 +1,4 @@ +# Instruct apt-get to NOT check the "Valid Until" date in Release files +# Once the Debian team archives a repo, they stop updating this date + +Acquire::Check-Valid-Until "false"; diff --git a/dockers/docker-ptf/ptf_tgen.sh b/dockers/docker-ptf/ptf_tgen.sh new file mode 100755 index 00000000000..03593276bdd --- /dev/null +++ b/dockers/docker-ptf/ptf_tgen.sh @@ -0,0 +1 @@ +# PLACEHOLDER - This file is intended to be overwritten by SPYTest. diff --git a/dockers/docker-ptf/sources.list.amd64 b/dockers/docker-ptf/sources.list.amd64 new file mode 100644 index 00000000000..516363f4927 --- /dev/null +++ b/dockers/docker-ptf/sources.list.amd64 @@ -0,0 +1,8 @@ +## Debian mirror on Microsoft Azure +## Ref: http://debian-archive.trafficmanager.net/ + +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z stretch/updates main contrib non-free +deb-src [arch=amd64] http://packages.trafficmanager.net/snapshot/debian-security/20230101T000243Z stretch/updates main contrib non-free +deb [arch=amd64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch-backports main contrib non-free diff --git a/dockers/docker-ptf/sources.list.arm64 b/dockers/docker-ptf/sources.list.arm64 new file mode 100644 index 00000000000..b31ceed2d66 --- /dev/null +++ b/dockers/docker-ptf/sources.list.arm64 @@ -0,0 +1,7 @@ +## Debian mirror for ARM repo + +# ARM repo +deb [arch=arm64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb-src [arch=arm64] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb [arch=arm64] http://security.debian.org stretch/updates main contrib non-free +deb-src [arch=arm64] http://security.debian.org stretch/updates main contrib non-free diff --git a/dockers/docker-ptf/sources.list.armhf b/dockers/docker-ptf/sources.list.armhf new file mode 100644 index 00000000000..09d05f78139 --- /dev/null +++ b/dockers/docker-ptf/sources.list.armhf @@ -0,0 +1,7 @@ +## Debian mirror for ARM repo + +# ARM repo +deb [arch=armhf] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb-src [arch=armhf] http://packages.trafficmanager.net/snapshot/debian/20230101T000234Z/ stretch main contrib non-free +deb [arch=armhf] http://security.debian.org stretch/updates main contrib non-free +deb-src [arch=armhf] http://security.debian.org stretch/updates main contrib non-free diff --git a/dockers/docker-router-advertiser/Dockerfile.j2 b/dockers/docker-router-advertiser/Dockerfile.j2 index 39e7b28effc..9f10391531e 100644 --- a/dockers/docker-router-advertiser/Dockerfile.j2 +++ b/dockers/docker-router-advertiser/Dockerfile.j2 @@ -24,10 +24,9 @@ RUN apt-get clean -y && \ apt-get autoremove -y && \ rm -rf /debs -COPY ["start.sh", "/usr/bin/"] -COPY ["docker-router-advertiser.supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["radvd.conf.j2", "wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] +COPY ["docker-init.sh", "/usr/bin/"] +COPY ["radvd.conf.j2", "wait_for_link.sh.j2", "docker-router-advertiser.supervisord.conf.j2", "/usr/share/sonic/templates/"] COPY ["files/supervisor-proc-exit-listener", "/usr/bin"] COPY ["critical_processes", "/etc/supervisor"] -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT ["/usr/bin/docker-init.sh"] diff --git a/dockers/docker-router-advertiser/base_image_files/monit_radv.j2 b/dockers/docker-router-advertiser/base_image_files/monit_radv.j2 new file mode 100644 index 00000000000..b5f462cd548 --- /dev/null +++ b/dockers/docker-router-advertiser/base_image_files/monit_radv.j2 @@ -0,0 +1,33 @@ +{# This template is used to generate Monit configuration file of router advertiser container -#} + +############################################################################### +## Monit configuration for radv container +## process list: +## radvd +############################################################################### +{# Router advertiser should only run on ToR (T0) devices which have #} +{# at least one VLAN interface which has an IPv6 address asigned #} +{# But not for specific deployment_id #} +{%- set vlan_v6 = namespace(count=0) -%} +{%- if DEVICE_METADATA is defined and DEVICE_METADATA.localhost is defined -%} + {%- if DEVICE_METADATA.localhost.deployment_id is defined and DEVICE_METADATA.localhost.type is defined -%} + {%- if DEVICE_METADATA.localhost.deployment_id != "8" -%} + {%- if "ToRRouter" in DEVICE_METADATA.localhost.type and DEVICE_METADATA.localhost.type != "MgmtToRRouter" -%} + {%- if VLAN_INTERFACE -%} + {%- for (name, prefix) in VLAN_INTERFACE|pfx_filter -%} + {# If this VLAN has an IPv6 address... #} + {%- if prefix | ipv6 -%} + {%- set vlan_v6.count = vlan_v6.count + 1 -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} +{%- endif -%} + +{%- if vlan_v6.count > 0 -%} +{# Check the running status of radvd process #} +check program radv|radvd with path "/usr/bin/process_checker radv /usr/sbin/radvd -n" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles +{%- endif -%} diff --git a/dockers/docker-router-advertiser/docker-init.sh b/dockers/docker-router-advertiser/docker-init.sh new file mode 100755 index 00000000000..a3f373f438a --- /dev/null +++ b/dockers/docker-router-advertiser/docker-init.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +mkdir -p /etc/supervisor/conf.d + +# Generate supervisord router advertiser config, /etc/radvd.conf config file, and +# the script that waits for pertinent interfaces to come up and make it executable +CFGGEN_PARAMS=" \ + -d \ + -t /usr/share/sonic/templates/docker-router-advertiser.supervisord.conf.j2,/etc/supervisor/conf.d/supervisord.conf \ + -t /usr/share/sonic/templates/radvd.conf.j2,/etc/radvd.conf \ + -t /usr/share/sonic/templates/wait_for_link.sh.j2,/usr/bin/wait_for_link.sh \ +" +sonic-cfggen $CFGGEN_PARAMS + +chmod +x /usr/bin/wait_for_link.sh + +exec /usr/bin/supervisord diff --git a/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf b/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf deleted file mode 100644 index bf9320acc77..00000000000 --- a/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf +++ /dev/null @@ -1,35 +0,0 @@ -[supervisord] -logfile_maxbytes=1MB -logfile_backups=2 -nodaemon=true - -[eventlistener:supervisor-proc-exit-script] -command=/usr/bin/supervisor-proc-exit-listener --container-name radv -events=PROCESS_STATE_EXITED -autostart=true -autorestart=unexpected - -[program:start.sh] -command=/usr/bin/start.sh -priority=1 -autostart=true -autorestart=false -startsecs=0 -stdout_logfile=syslog -stderr_logfile=syslog - -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=2 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:radvd] -command=/usr/sbin/radvd -n -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog diff --git a/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf.j2 b/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf.j2 new file mode 100644 index 00000000000..09fb9a4cbb4 --- /dev/null +++ b/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf.j2 @@ -0,0 +1,69 @@ +[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 +buffer_size=1024 + +[eventlistener:supervisor-proc-exit-script] +command=/usr/bin/supervisor-proc-exit-listener --container-name radv +events=PROCESS_STATE_EXITED +autostart=true +autorestart=unexpected +buffer_size=1024 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true + +{# Router advertiser should only run on ToR (T0) devices which have #} +{# at least one VLAN interface which has an IPv6 address asigned #} +{# But not for specific deployment_id #} +{%- set vlan_v6 = namespace(count=0) -%} +{%- if DEVICE_METADATA.localhost.deployment_id != "8" -%} + {%- if "ToRRouter" in DEVICE_METADATA.localhost.type and DEVICE_METADATA.localhost.type != "MgmtToRRouter" -%} + {%- if VLAN_INTERFACE -%} + {%- for (name, prefix) in VLAN_INTERFACE|pfx_filter -%} + {# If this VLAN has an IPv6 address... #} + {%- if prefix | ipv6 -%} + {%- set vlan_v6.count = vlan_v6.count + 1 -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- endif -%} +{%- endif -%} + +{%- if vlan_v6.count > 0 %} +[program:wait_for_link] +command=/usr/bin/wait_for_link.sh +priority=3 +autostart=false +autorestart=false +startsecs=0 +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running + +[program:radvd] +command=/usr/sbin/radvd -n +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=wait_for_link:exited +{% endif -%} diff --git a/dockers/docker-router-advertiser/radvd.conf.j2 b/dockers/docker-router-advertiser/radvd.conf.j2 index bc323977b13..3880ef96076 100644 --- a/dockers/docker-router-advertiser/radvd.conf.j2 +++ b/dockers/docker-router-advertiser/radvd.conf.j2 @@ -10,19 +10,32 @@ {# If our configuration has VLAN interfaces... #} {% if VLAN_INTERFACE %} -{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} -{# If this VLAN has an IPv6 address... #} +{% set vlan_list = dict() %} +{% for (name,prefix) in VLAN_INTERFACE|pfx_filter %} +{% if name is not in vlan_list and prefix | ipv6 %} +{% set prefix_list = [] %} +{% set _ = vlan_list.update({name: prefix_list}) %} +{% endif %} {% if prefix | ipv6 %} +{# If our configuration has VLAN interfaces... #} +{% set prefix_list = vlan_list.get(name) %} +{% set _ = prefix_list.append(prefix) %} +{% set _ = vlan_list.update({name: prefix_list}) %} +{% endif %} +{% endfor %} +{% endif %} +{% for name, prefixes in vlan_list.items() %} interface {{ name }} { IgnoreIfMissing on; AdvSendAdvert on; - MinRtrAdvInterval 200; - MaxRtrAdvInterval 600; + MinRtrAdvInterval 60; + MaxRtrAdvInterval 180; AdvManagedFlag on; AdvOtherConfigFlag off; AdvLinkMTU 9100; AdvHomeAgentFlag off; +{% for prefix in prefixes %} prefix {{ prefix | network }}/{{ prefix | prefixlen }} { AdvOnLink on; AdvAutonomous off; @@ -30,8 +43,7 @@ interface {{ name }} AdvValidLifetime infinity; AdvPreferredLifetime infinity; }; +{% endfor %} }; -{% endif %} {% endfor %} -{% endif %} diff --git a/dockers/docker-router-advertiser/start.sh b/dockers/docker-router-advertiser/start.sh deleted file mode 100755 index 8d5f73a8bcb..00000000000 --- a/dockers/docker-router-advertiser/start.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -rm -f /var/run/rsyslogd.pid - -supervisorctl start rsyslogd - -# Router advertiser should only run on ToR (T0) devices -DEVICE_ROLE=$(sonic-cfggen -d -v "DEVICE_METADATA.localhost.type") -if [ "$DEVICE_ROLE" != "ToRRouter" ]; then - echo "Device role is not ToRRouter. Not starting router advertiser process." - exit 0 -fi - -# Generate /etc/radvd.conf config file -sonic-cfggen -d -t /usr/share/sonic/templates/radvd.conf.j2 > /etc/radvd.conf - -# Enusre at least one interface is specified in radvd.conf -NUM_IFACES=$(grep -c "^interface " /etc/radvd.conf) -if [ $NUM_IFACES -eq 0 ]; then - echo "No interfaces specified in radvd.conf. Not starting router advertiser process." - exit 0 -fi - -# Generate the script that waits for pertinent interfaces to come up and make it executable -sonic-cfggen -d -t /usr/share/sonic/templates/wait_for_intf.sh.j2 > /usr/bin/wait_for_intf.sh -chmod +x /usr/bin/wait_for_intf.sh - -# Wait for pertinent interfaces to come up -/usr/bin/wait_for_intf.sh - -# Start the router advertiser -supervisorctl start radvd diff --git a/dockers/docker-router-advertiser/wait_for_intf.sh.j2 b/dockers/docker-router-advertiser/wait_for_link.sh.j2 similarity index 100% rename from dockers/docker-router-advertiser/wait_for_intf.sh.j2 rename to dockers/docker-router-advertiser/wait_for_link.sh.j2 diff --git a/dockers/docker-sflow/Dockerfile.j2 b/dockers/docker-sflow/Dockerfile.j2 index 75da64e02e4..f532a4040e0 100644 --- a/dockers/docker-sflow/Dockerfile.j2 +++ b/dockers/docker-sflow/Dockerfile.j2 @@ -27,7 +27,6 @@ RUN apt-get clean -y && \ RUN sed -ri '/^DAEMON_ARGS=""/c DAEMON_ARGS="-c /var/log/hsflowd.crash"' /etc/init.d/hsflowd -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"] diff --git a/dockers/docker-sflow/base_image_files/monit_sflow b/dockers/docker-sflow/base_image_files/monit_sflow index d041f81001e..84b36b18ce6 100644 --- a/dockers/docker-sflow/base_image_files/monit_sflow +++ b/dockers/docker-sflow/base_image_files/monit_sflow @@ -3,5 +3,5 @@ ## process list: ## sflowmgrd ############################################################################### -check process sflowmgrd matching "/usr/bin/sflowmgrd" - if does not exist for 5 times within 5 cycles then alert +check program sflow|sflowmgrd with path "/usr/bin/process_checker sflow /usr/bin/sflowmgrd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles diff --git a/dockers/docker-sflow/start.sh b/dockers/docker-sflow/start.sh deleted file mode 100755 index aaefb4d6d00..00000000000 --- a/dockers/docker-sflow/start.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -rm -f /var/run/rsyslogd.pid - -supervisorctl start rsyslogd - -supervisorctl start sflowmgrd diff --git a/dockers/docker-sflow/supervisord.conf b/dockers/docker-sflow/supervisord.conf index 8eb1bdc05e5..f4e06f1ff2e 100644 --- a/dockers/docker-sflow/supervisord.conf +++ b/dockers/docker-sflow/supervisord.conf @@ -3,32 +3,37 @@ 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 +buffer_size=1024 + [eventlistener:supervisor-proc-exit-listener] command=/usr/bin/supervisor-proc-exit-listener --container-name sflow events=PROCESS_STATE_EXITED autostart=true autorestart=unexpected - -[program:start.sh] -command=/usr/bin/start.sh -priority=1 -autostart=true -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog +buffer_size=1024 [program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=2 +command=/usr/sbin/rsyslogd -n -iNONE +priority=1 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true [program:sflowmgrd] command=/usr/bin/sflowmgrd -priority=3 +priority=2 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +dependent_startup=true +dependent_startup_wait_for=rsyslogd:running diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index b62ff61eaf9..f9f10e9d860 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -42,8 +42,12 @@ ENV LC_CTYPE=en_US.UTF-8 RUN sed -i '/^#.* en_US.* /s/^#//' /etc/locale.gen RUN locale-gen -# Install up-to-date version of pip -RUN curl https://bootstrap.pypa.io/get-pip.py | python3.6 +COPY ["get-pip.py", "/usr/bin/"] +RUN python3.6 /usr/bin/get-pip.py pip==21.0.1 + +# pin down setuptools version for issues to install sonic_ax_impl +# see https://github.com/Azure/sonic-buildimage/issues/5279 +RUN python3.6 -m pip install setuptools==49.6.0 # Install pyyaml dependency for use by some plugins # Install smbus dependency for use by some plugins diff --git a/dockers/docker-snmp-sv2/base_image_files/monit_snmp b/dockers/docker-snmp-sv2/base_image_files/monit_snmp index 811f9d14b3d..708e3fcba53 100644 --- a/dockers/docker-snmp-sv2/base_image_files/monit_snmp +++ b/dockers/docker-snmp-sv2/base_image_files/monit_snmp @@ -4,8 +4,8 @@ ## snmpd ## snmpd_subagent ############################################################################### -check process snmpd matching "/usr/sbin/snmpd -f" - if does not exist for 5 times within 5 cycles then alert +check program snmp|snmpd with path "/usr/bin/process_checker snmp /usr/sbin/snmpd" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles -check process snmp_subagent matching "python3.6 -m sonic_ax_impl" - if does not exist for 5 times within 5 cycles then alert +check program snmp|snmp_subagent with path "/usr/bin/process_checker snmp python3.6 -m sonic_ax_impl" + if status != 0 for 5 times within 5 cycles then alert repeat every 1 cycles diff --git a/dockers/docker-snmp-sv2/get-pip.py b/dockers/docker-snmp-sv2/get-pip.py new file mode 100755 index 00000000000..78643a49576 --- /dev/null +++ b/dockers/docker-snmp-sv2/get-pip.py @@ -0,0 +1,24226 @@ +#!/usr/bin/env python +# +# Hi There! +# You may be wondering what this giant blob of binary data here is, you might +# even be worried that we're up to something nefarious (good for you for being +# paranoid!). This is a base85 encoding of a zip file, this zip file contains +# an entire copy of pip (version 21.0). +# +# Pip is a thing that installs packages, pip itself is a package that someone +# might want to install, especially if they're looking to run this get-pip.py +# script. Pip has a lot of code to deal with the security of installing +# packages, various edge cases on various platforms, and other such sort of +# "tribal knowledge" that has been encoded in its code base. Because of this +# we basically include an entire copy of pip inside this blob. We do this +# because the alternatives are attempt to implement a "minipip" that probably +# doesn't do things correctly and has weird edge cases, or compress pip itself +# down into a single file. +# +# If you're wondering how this is created, it is using an invoke task located +# in tasks/generate.py called "installer". It can be invoked by using +# ``invoke generate.installer``. + +import os.path +import pkgutil +import shutil +import sys +import struct +import tempfile + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + iterbytes = iter +else: + def iterbytes(buf): + return (ord(byte) for byte in buf) + +try: + from base64 import b85decode +except ImportError: + _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") + + def b85decode(b): + _b85dec = [None] * 256 + for i, c in enumerate(iterbytes(_b85alphabet)): + _b85dec[c] = i + + padding = (-len(b)) % 5 + b = b + b'~' * padding + out = [] + packI = struct.Struct('!I').pack + for i in range(0, len(b), 5): + chunk = b[i:i + 5] + acc = 0 + try: + for c in iterbytes(chunk): + acc = acc * 85 + _b85dec[c] + except TypeError: + for j, c in enumerate(iterbytes(chunk)): + if _b85dec[c] is None: + raise ValueError( + 'bad base85 character at position %d' % (i + j) + ) + raise + try: + out.append(packI(acc)) + except struct.error: + raise ValueError('base85 overflow in hunk starting at byte %d' + % i) + + result = b''.join(out) + if padding: + result = result[:-padding] + return result + + +def bootstrap(tmpdir=None): + # Import pip so we can use it to install pip and maybe setuptools too + from pip._internal.cli.main import main as pip_entry_point + from pip._internal.commands.install import InstallCommand + from pip._internal.req.constructors import install_req_from_line + + # Wrapper to provide default certificate with the lowest priority + # Due to pip._internal.commands.commands_dict structure, a monkeypatch + # seems the simplest workaround. + install_parse_args = InstallCommand.parse_args + + def cert_parse_args(self, args): + # If cert isn't specified in config or environment, we provide our + # own certificate through defaults. + # This allows user to specify custom cert anywhere one likes: + # config, environment variable or argv. + if not self.parser.get_default_values().cert: + self.parser.defaults["cert"] = cert_path # calculated below + return install_parse_args(self, args) + InstallCommand.parse_args = cert_parse_args + + implicit_pip = True + implicit_setuptools = True + implicit_wheel = True + + # Check if the user has requested us not to install setuptools + if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"): + args = [x for x in sys.argv[1:] if x != "--no-setuptools"] + implicit_setuptools = False + else: + args = sys.argv[1:] + + # Check if the user has requested us not to install wheel + if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"): + args = [x for x in args if x != "--no-wheel"] + implicit_wheel = False + + # We only want to implicitly install setuptools and wheel if they don't + # already exist on the target platform. + if implicit_setuptools: + try: + import setuptools # noqa + implicit_setuptools = False + except ImportError: + pass + if implicit_wheel: + try: + import wheel # noqa + implicit_wheel = False + except ImportError: + pass + + # We want to support people passing things like 'pip<8' to get-pip.py which + # will let them install a specific version. However because of the dreaded + # DoubleRequirement error if any of the args look like they might be a + # specific for one of our packages, then we'll turn off the implicit + # install of them. + for arg in args: + try: + req = install_req_from_line(arg) + except Exception: + continue + + if implicit_pip and req.name == "pip": + implicit_pip = False + elif implicit_setuptools and req.name == "setuptools": + implicit_setuptools = False + elif implicit_wheel and req.name == "wheel": + implicit_wheel = False + + # Add any implicit installations to the end of our args + if implicit_pip: + args += ["pip"] + if implicit_setuptools: + args += ["setuptools"] + if implicit_wheel: + args += ["wheel"] + + # Add our default arguments + args = ["install", "--upgrade", "--force-reinstall"] + args + + delete_tmpdir = False + try: + # Create a temporary directory to act as a working directory if we were + # not given one. + if tmpdir is None: + tmpdir = tempfile.mkdtemp() + delete_tmpdir = True + + # We need to extract the SSL certificates from requests so that they + # can be passed to --cert + cert_path = os.path.join(tmpdir, "cacert.pem") + with open(cert_path, "wb") as cert: + cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem")) + + # Execute the included pip and use it to install the latest pip and + # setuptools from PyPI + sys.exit(pip_entry_point(args)) + finally: + # Remove our temporary directory + if delete_tmpdir and tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +def main(): + tmpdir = None + try: + # Create a temporary working directory + tmpdir = tempfile.mkdtemp() + + # Unpack the zipfile into the temporary directory + pip_zip = os.path.join(tmpdir, "pip.zip") + with open(pip_zip, "wb") as fp: + fp.write(b85decode(DATA.replace(b"\n", b""))) + + # Add the zipfile to sys.path so that we can import it + sys.path.insert(0, pip_zip) + + # Run the bootstrap + bootstrap(tmpdir=tmpdir) + finally: + # Clean up our temporary working directory + if tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +DATA = b""" +P)h>@6aWAK2mn=eH&U3EaRn*?007qk000jF003}la4%n9X>MtBUtcb8d2Ny1O2a@9h3^A-haq0rLQPZ +zwNOEdKSdjh=tU`I**24QA=zDaCYHRtyVewiE_-!m_~y)+(wQ2pvZ+v-(P>$w4XcV$ZmrTAP_;FVVLG +49#rXMQ{36~z^L&y&#Zero@!2cnyig*BTmX+~y0w9ir_(Dfs5CTS!TwbK-$-Yux3AI$ZC* +6idxzX7FMV|yN4x!hf7J~b|mPMiVlc7MCKCS@}B5av04YO>cc-ySfwW%}PTA6ujridD(?E32VCOw$@6VCgzz{qMr +KG3HOxd*n^DV*EBi{& +r>G+u`~XpaqsrtPVcN(S5-?%bQer&>FcKXemnqu +nF|Yp|BN~U4d9lTFU?V2uvjIZ&)>RbG%xIUAN9VQoeSZmx)MkTIG?Gb-Rcva4BGHEDg4LuBE%%M6{7Q +Nxx6(-$y+%gDAtK7Xdk(}>JdT7L{yHGE*JO)@m7WG72|9YC&6Q~K981}iS3?+P7%#eP``3cGCf8F(Q& +v+Qj^=GB%KYAkI&pvZe+J!fBi2hG|iU^DNYQjKDC)CcbR)5flg?fknpBcMt3}Vk@6aWAK2mn=eH&R;*55hD700002000>P003}la4%nJZggdGZeeUMUtei%X +>?y-E^v8mkxxs*KoG_6fqaLdy|hr1i=Yb4HLH@;h8n85g1Ekw0Usa^GK7DlSUd2%rMCzxZ2qgCE|7pk&PEc<5TJ@Vd8_`;U$p}Y%i97jJ;O +9KQH0000809AE2QmC`OYkvs<0D~X^02%-Q0B~t=FJEbHbY*gGVQepAb!lv5UuAA~E^v9}8C`GNIPyI} +{sT9Ckc5+j>pdFh1GZ_pEv}mcO}dN1Fa$-S6JBIdN6JooMgIHEP^3gsOxmK4>la(pd~v>Kd~$N~X2+V +EoV9xX=sI9B+(ETqNak@Z&}rAAmqF2StE0xRPlDhZVm7)?ThZv-|@C+*o}q{LzVrVM0 +piR$GW`O)3)X!@9u94K_%abijGozqW|47K~W_s`GX1xBAx=#2E~1>2LFf^&Dx0R5j$gp->9#9sCJg2^JimntS3MVp +l;CT4Tfi;r7s(ttbPY}9_b-=UiqrRJr~fWKeLg?`aQ>TekWJvl;`oTbM-c`hlj5&MS<#!ay1#}~7s%r +D0i-Bz8k&-i;2bHr=up9BlM=8=O0IVuz8gqbMBFRD-RNW90k86wg3aJ@)W_v;`c54p4fJn#y)=%VgHw +G}XK_)qF6o`?ie0;Y+Kp+6doV9e*mFLQsvzAT*%inzd@bPVNcK%07ZX13B0v?LtGPN>~<(@{$QHR>?DJs#bO|i!{#; +{3E*vAk@XzKhwoVBqLJRhP1A(JF=@v-Ep$YU*uqn3+p*+dXYd{0GF9wG}o2?(hpTv>WOsS&f|3ew5ih +qpcBWq1^9Pyvc2D98gXLfimk>?$bVm(7mK815Ew#!<$+?4ZEa@qlNNQxZZkV&>2`SSaS$QN$~9x|2QM +vj0&cSx>xx|cE +DfM%^AEyf6!DAg)@Xmb|>Ki|$wN&16W=IP?*`MaC{o-$?*?dk^ +P6*aY>!z;M_cx#8u)YiTOu3wZ~@1BVY$f(_ZG^Vn{>{6PRhY+BR2rZt#8V2~(^=7(dyn<`tTL%TbNdq +v)X$3k;b3*Kpe$p(Lc#H@0us$uyYl?w(fM+vRnK^D3LfS*bQtHpYbaNqKWcBu0RO8YpO1F679V&HvWZ +U6m6JT2zn_`%nCS=acDmKv;Yaa&ry11vQcTd**rS-^O8^SOJBT4~Tpe6=MZT?MFy^t}o*S8r_zX1HOz +q16i9QN_)0lTlT35`lY|t7E9nWeEA>6@|{KP6-$k+bHO|hJwmy$O&H!=@XmqF@dW5sfP`xy)qxi$4u6 +K-oKy~p%6=`0^g$F?~nn5&H^{dH&|hzf?0mQv>#Gp#9g|jXsW(LBSUeV_`yy_XRLBh0ewHO7uX0a&_Q +%}g~Nt!Fp$uTt;6N7*YB}$xcqYc{^I=n;`7znr>hUwXVaO2aI?PE)avx&RBR{7@TM*tD07e1z}o^vFW +1nX#dTRwMcshF9Ne(p91`-OK-cbhRhm!>K)`hljlIUiYIxh0tL|uZUx;a +8B=vj`M>41yv%OHAwo;N>SgfvSzZ!nQ3uq+Z?OJU#6rg1tn5I6#xG!4r4=ke6yFf-Ny{f`&ZA-R5aKb +kv)`J>_{Qpow3ab+(FX@rL^yzJxl+V&aJV&|6OE%E-ZuNjI!?byey|g^fi9ll*S!Sg0(~ +HA1RS4KW$Q<`Uv9$(-kcPo025L$2g6nxV$Ks@L=8#l{oxfbf9`!l8meLemTolDn|HQ3a{e7L6()L0a! +vfPm@MDpAy>=#3F?gB9I5ju3LqI!|8wAfLvSHI^Wg~CdHZh;5SS@zJccJpVP|r?b(~pzjm&R}Cyii6tEw9Uah`qgScmcxRu>> +01a4L6m5oqKEQPi^izf9 +yGX;@dz8)C7QPBR`^NP%1k4m*lqw=?N8?EPj?3O6-HROzD0P9y-=eNzGlT{D__cORtR@P<%O48N-Vmj +NHWWI-An{2P02l>n4eNUy4&S5!pqYsrH*Z;Rvse0#b|wt1h|K?IvCj8u`J>M~$-IBfVq}vV*ron<{@g +j|7oEQ{kNpFa4WJ?V6_R(xJGJ`BR7;}bRV~fY&OYjh_|rS{u9WiU=hXm}zrwKMU%P_fXm{ODsqQb=Dv +6Rwihu8Y*urFi64Lri2rjVW|36Sm0|XQR000O8RdqK~<(T65ehUBqkthHF761SMaA|NaUukZ1WpZv|Y +%gPBV`ybAaCzNYZI9cy5&j+^|AAF-Sh-NNhagQ+11^x;+gySs=^@D>I4l+dEzvd;SyV}C9pB;pduN7v +AtiZt+a3yB{K0Ec`J-rpFbH@^$(@mZe_L +YpOwLt8?E-NmUWulh^kOJt$F^L4Xi3Y?t~~`$Wpk)GfVfX5T!{=S$*!-zJ}ko%{?H|ZZhpKJDVg)t=QLDA$ +2$Z13Z5(waBf~$AsZ)c$=RHhNHK&FwC;DuXfdh +s_MB<--RIK146v_IU*ye=l>JfQ}4&|C5x?%Y?lb776wX?{<|Bd^=q+R`o{dJ-1n|Dyvnm^A|LF;RcZi +`mE4w)j4mv74|ia#TofcmMw7J!v}@funhelY?9l!ShUhULQ%z%#VFpDu{vS!b-iGZ|BgT0B#5GS!Zx~ +M90vKi6wK`SlP6D^+Q1M}M0Mz6O7VtE3^0Y^l@`suHgN%DL4xeFIGWW5-9UgCQFG0~8_X(>k|<%(GFl +`|RHo4)<0hAqW-c5-?HFi7ICcBSCKXi}0-cIWoBa1~P~lNPyK9L&g0oZzW2S4r^B7`Vj{>cNG1rk?5n@BR# +wKN9RtPQa&k*zTIlI +4a;;5k&r&IVs17<12^p8VAMdT5H+9&%;Cz}zCMD9s(ybMg1lj%8rErjM9sGuzk$M0C1 +Ve9?%|3gk?Xe31&N~e5FK(YOKFb`VM^*#*jZbf<@xy*glg6)%s#J=H9rT;axRU5B!2$aCx3f3<7`*a7 +!s3R#)E!>J+ZbGe6qY9cU691`O=AskqHDTUdbd5Fkp61t_ZJYJfsUK`MZkV1^s?VDNJEKMrFRVI5Wb6CenW~Y|a=XE2CAo~W)j1q3Es +H;GG1Cp45F4&J`Bit|&Z=UZ{?DfhRgAvLM5K-8O#50KSB>#hf(UGow=YpVar9v?XumI%@)fW?530NC& +Aebn|pX2>8O8f0F`zq|ejXgC#WH044R)#q4hZ5p(v6#5>u*mo4sSx)CUVS5oAHNyw%PVC>>#nI-b3N;<&FgbR{T8;tQgN#DT#Bsz|r%V89m%0DAGiD7fp7-%ET=r# +jRs$Mn7MI_4JlK%OSh;+o=316-jq8>o3@haUdRp6;G4+a`isn1x|o7&HmNM|Q4T6q}$ +*f#gz0)m<^Scj1hI}Zm3lFmSmuED8G5K!VNQhzYo5v!X08piOn$niCFIAA^wP#ja|K$nnLyJb6Hdv1Z +{0@~DnH6mq~={9BQd7A|MhO1D&h>F_B&W&+ThpPN@7Svpa;5#@Di@r_2g15Ry6Q7cd(t8bvZ#u-zdmLaSD3%=PC4PuBv5MFDxDNM}x;(3RZ56Q!2+;E6nigmLFPgnJLrqI5bW=Q +@=>I*dhiaK3*Z)k6QwV5ZZ4#NJaRv_6d%Y`a`KEt^@(un9`2yPpcC`&1~V$@zX-An{7OOji2b%wt}t*QiWea*f*{!z#m8tfE%I{s|zLE84Z* +|$^injP(#WGN|+zCghmz<8kzqalSaurCEwJ}bU|cH7cKq+jUt0ihkf|OVIa+6ce0Qgs7c<#m5bS=rAxlmK_6pC$hCakhI}l7aiqhov;Ak*)_XwJJ5efS!~SM;6 +<&&tda!2NxNIkhxyR3#x +94PIsdV8YEBCIkNqSu?UR^6S4uXSRVaL#IUqCsy4O7MPo@CCS~+4-n>J@G-pbQ4!2q{|tiI6$;C)~Wd +eBCU2Qo>#bBz12Jyn+EIz8iNN2AxON52LuJ~+a~zj5kzu?%%NEXbj76$*Y4zfqZ-7Y4o4Yc(O=ItQXB +h+XwJH8#NWmjXqihD-6`3mUp>wEm=LMACp1npGalcm>UU}p+Z;KO>hv*F$b#el_h!V?$~_tRIxsbQjl +eACANF~}@eIltaWXza9Y{iW&RmKG^>#Gqtxo-d+!^2J><_8`p7u~b!VBHufNYr2U9sGKWEPxwqwZ5`h ++VX|MgiQCJ7nNGWFm6lCQPG#(dY<5`ldJ$nwOJ*s|b(XgoW;+Z=6SAKGOrO$Y|lXZ=lsJI6E}VYGkJX +0CYb=^p?f8gwWx^te*~Mh~1LJ(@pn3IwvI`<(02U@)x``6VY**D}Vn6P)h>@6aWAK2mn=eH&U#ufx0# +j005CU0015U003}la4%nJZggdGZeeUMV{dL|X=inEVRUJ4ZZ2?n%^Ur1+s5_x0Qn!TGy+km%rspwtOm +5rjg{1hBO7);8fXGXizn-5iX`qRE1Kc`?R)P&$h#vcCrb-VEfR^md-v{reCZ=%GWF}vf^fU^z_Lg$&)pG`h<{ULAIP#70n6D$wC4nOO{a);j+6V+sJhv@ +C!+VC>AWKXiB!MT9HJ!(kGAi%4$by@IA?VGqW&s +&0)Zi9QnE6NSq|jPlPsd27qmoF1kr0lya*u#f_9l~6@f1#ugTb9e +dNC;2jpr6N3N1QRRG?wJcV8QoG`%O!H9^85Alqb=hIiGuj5~iuO`#uw-Z=7K%%gm4G7#)Q<>0AQ1u3n +A3S|BnSO|I!&Q9xdU}32If0$Q9pwTp0pNob%}Ob-2jm?{`7N9(NU?OqU7!Yl9weNCZmKn7$sa9r@2@7 +8<6r|f1DN`AK;Gj`uS&XLOSVu8U!R@-a(p%pZnEM!$<$&X#ZFXoO+K=es%2NF?|S>T)Cf3u$7$<9*C`IMMowhd+Jt;rQ(IBtAPoK8eq#XP;__HVhX!LPWNq@sQ%Ctw?l3t +26m5jAJx)aV+Hr89Y6IH#s72lif8Xz$Z~Wd=XyHHtwL0NE>ag}Bo~j-m~Zfd>NoD_|KmuOvy{&>cw&D&%&cZI +u9wv_Llu#z%Tg;{(CiAV(t-crY#~UnQj=yJADO;1gjFhylvTKxt}p{{VI-2d*XQ->lukXo(V0h1#o{= +R9Gsx$TQW=QhI@K_gLStO|h|Bl2R{kQbync1%(%BZaUPW#|}EAtDy3!T?SShOG-bhiGBBZ=l)c@u-WzBY!O#&m% +JPc`$D+MEeU1+oT@(mo0u`aEk(Tm&gEU2__DeGg&M^i7 +x9 +JHQYXHzza^J0z;&2%fbj8fphY6+jK0q)C-1A^ryp{k#LRhNh1UcFqcu2$w6A}W!38DiUasLn)_tFL^fkFVQY|A<+L-7BQHFy{ghwZK2BkLzJB{Dn#`( +?g*D;liF%?)fKACO<@B0>MT#Tbf~q~giq7B8hTN_cz&1gYgm<&MrFu}U4#J>9zq>%%Y^N0t9i7c(Kxav(r-~L7>&O`RAR7HQkrW;fS4B)yh_&`pptd$ +mw5o4#DIKvg{L8*U%f2*G$Q}-g4QWjVJa95p>ja@ohV$?W4s +?Y#lTk0itl_YrXmVOK_rioEhLZ>w_P}#{b1c)m0rjxc(KpY+;ziKveOVAf{nF!gxaR+V9T(l2NvbsB9 +tH*gCr{j1&Y*JLxLs|JY9}dkc`S?rKf@RC9HAigWyph_|6>S3zx)5yEnkF^Rgxng1b3~zNQc>822FSG +rk9odXRjCtqs~Uz^TnlNTNDf+2`Pv!L$HJyIA2B!FS!mUk`yp3(=;GU!x6E7!s3X+%m>-`b}yUcjOESlZmOUXnc{lZm&oX%r+Is3M)F3X(z}VS=(Axz_j +~7P>IEN<^$rHx=Tcha7(N>Lg8DtKG$VAuvC5E@fD6U&3~&GnedhDW*V)x(se_SttB92E>gw3?1G$Qn< +-GVqfohYB)X4SzmwMfpGbL!u!ei2wL3IMMbMi#T^GOvRq1o3a@Zy7suHZ0lW +n4|qkyDQd-+!+0aBn|LA;xR_f*AvRo)^qmX2S{BXR-x9Y6!WC3_7JLy_yvO%$|Yb(n*9R_?b>b}|B3m +k@&_%St7j_N}^a0bV61wac3+!(Kz#7(pDOO%^b_cX2yx72{Ohw_qDHL>*_G`GymL2hQhh6H`U>Rb|pjr +pm3p=`2W)OQ0fhFmhX(Q114+)Jz7yxM*@tGjaZ*$+oAAp9DW +8JLHZ-sPJt^TP~B(mN_%SGTN`-DRXuPi>Z@8>vnm4lc0r_<``dm!MP#vcb-SFl@0K*w-U0BaKU)sw;A +s1kby6ZO?JNT-X^yoGw+<7)LOS@i4-P@g!{iXRY!7RP|5d27s3QU{$)tHrJK20uS&lyXI?uAwh;l29x +i`-pY=?wC +gfulT!)o1E%dwPLZ-U8c|Y$k4!@^tQodVhD1)KBp!-grbAT+O^)K#_4>TeE6X4vFGk>hz#mm$^^H#A< +Di8>1JENY_O2_wS(tPnY!emr!$hGVsh>NK@}(x@zNr|yTnXB1tGnzFt`&W4xkGG$Fv2&eS@9Z%HsXfa+5Tg1jsyUNuNH$q +B;zWm}x*SOy2Y*D22gyNrF)h>na6{TcVRi!w3{`>~Qwaqn7bUiP3W%9ga<#Q&)hKlDu{ru-YeNi&lHE +PylLg5CY$j5=6Vi0x1=>CB$RteZ9aOdKYrVxJAgdNVps1XhhQB)4s28M;NAmH*TWIlFB-2OJOm8Ov@HuR#;QDId83GrJjz9}MQ@vAzLNY~gh>El`Z3iSBxEKwhC$ +?85S9?@0kU+aiU%H41>t{b5&CL{EXD}|8>N;*~Ahjpr-Z2Uuy5@XcLLtBX_S=yXW%wUF=3=GBI8aC{+ +LU^9&y9agZtC&KA0cyD^$9U-N*Smzon7G8I80k9o6(0##xJSr+F93f>Ho7%sERTY$MmI!5}DOSa;-3O_qb~wse?-*n_uS%lufC9J=|bhP*q@#TRqmbI5L*h*_>_UK1Tz_-lOD&!Fr?UmN-<9PCvX6+*l!)7MPtxb4s6Gu{;W{)3J95|*K +*R5o219wr7&K($2tY{bf7K2-k{f2DkRinOULaw(l_Tv{f#ylJKUJv=VhH_f@r;`DQ+2M=%|K@Pp?JcW +xP*;O`!(>lPI?@R_x@6=KCakXH(8AFVn1wHB6uO#)qlCapY4DQv*v7F +Y8V?GE^v9(TitKlI1+y^(EowwKG+5v-R=&4CQYzS+G~?87Tv<3CEDgj61Ak1)Ene~z +nLK^Q6Emy?Y^9`ms%D%L(b=KhP=^ebo4nEMJZKoSY<@Q%8gdldZVh66+FJ?YcU#)oo&<#xujCQt9&Kb1=mJs`+_)bxY?v~=|?S2;5m5RX8uyf<&3?S2L8SwDex58*TZT3HzH4zj*9 +E`LJOlR9ShS?Fr}8u3g_;ar^O$YFr|qym54@i@9fVr_+knWzvwfr1qUSXfAE7Td763>r}hykNi8ywli +;5}i&Jh4dn=10t(BhCDxNwCf<}MhMj#U={7a{1Kl_lxTWOB(EFDiUAoEJ(Li4nt!es6=S?g;!Ko0;U(Wm+J1S*CA!h=M&yjgU?~QvkIs%R4qhHy9E_OKZ1nc$S9_=D +$8Sa~b5z+1e&?3NPNR!LYh!BpyNFB1^TbZOO5kk-_P_8%Cu7fcJiP+fEGrFeexWPDfJQiLEy_n`p$OO +nm@y+WnR1~NT_d8?oeaiO!LrZ +A}*OJH29O41bi2j@%umO2Ry}_+z%-O|8F#N{U3WA|%G_(|`Nvl(lG-U8IiFpnKcItT=?N~6%Bf{mfeO +h(rO>1p1r1jhuFznRHcTkihIT#bZx`Y@&`oBWA#mx$|Y2acE1b*01%poa2)HgU4wl7yQ=1r`#WMm$vR +RS?FQyK>6U=|s-Dof?HAi_678&m=sP^v7AKql78*rYAhF&W+6edr|>5I|o^0@co8%s8@aJ0ylBIcwxT +Ymc8ckJB&$gqC!!%41x|q!-MBXwZrSt<^HHm0Xo*E_OSmVg_iK)fPtTCYX1EP!Q(Lu}sBVOno*QJ$)f +-AOA?vDvm2{7$#A&?U1`+D_{Z|%th2$$xo2CK3Ihwq+0M~>lPrAp}-iffILcpxmU$rsrEo4jctI#aSu +9}G>lu?F6(;^y~Xh4P-Phy)?>VHq%JF-iu?whlS7`OX~+uoLCWZ5K^n3%=6ANH?YeU(Udn|;U=PK}xL +#Kz+76euTHHugnV%||CNHIaI=it!k-6!VcvFBhsLLhN0=v@?^OW9p6PhS*mA-}~pTqly66VRp#akro# +@U@c9NlTiA~S1*gBIKDqbJXpgF^H)7^T2V8bCDj80oR7e+t|sPvxIt$Hv&LEH{wr9RDi{Lsx!rR}Ceb +Bg})*+E0UUtZV4j89{7l0DbGcuLT4n>hH}M0KbzqCugA)4sq%D(Bf2sfbauQfS0A7=vtm*H-0<~r9ZI +l7W=5bi>eTMGL34*52(D>_Vg?Bl*2B=pkpd}zme@o@>& +OBhv@jQwT{lg&6P%V)#Fr`Aq5V-N;wdBAd0aoZelvXNXr;&@CAX|V>5D3~9b9X;yqs|PkA{u@74}CwwBB3!D|8p>J+H+FBA`ixDApUS0;x= +Q6^iexWuX<~?#JQI0R$&M8juzg%PS5$ONL6w=phTUJBp!Zhk8YrSj$!o-BOKo2DQtK8d{VS{6n`4Xt- +cC&^-M;0kmr(4%^ra1OmdA59LYmSwea#c?pmLEd?y7Yb=Kw5nodfNY&a9AYWA=YY(Y_R#BBvXe%v~2! +-3-d&>;4eM2fX4{H6aN=sP)T&>4jMd#S6(F$=R`~W~3GbpZB3yjlX5D!6_-SQpKF^SQD;y!+AMq_K~W +4)$NAtzoGP~wM>X^>q#`C-11BWDSHrNJOrwL2N+Wk7V3Yq8x=dA3YA11cg?IuSaE2q@(^HEwTap;n6+ +yI;9)76#cIMunsn3sU}K(M2h=Fuzrx7HyzFm=28*pGy))v{cC!wur02jMZLEFcm--&FpY=zBB$UA4k6 +{nNMg?Kk$vmZJFmP|5Ir7sN9!Ir9EQ!V$dN^S!lF3H4=#@f(@PHyp}OG?_U&z^)-g9P5xYGU(6I+Q1x_Tc~DMD;a~U1ISo~n~N1JVaq0|x) +s_rYBrn<65@-ZK!u0{FpMzy7;0~Y6lt%!~AU1Cs9-?XeQ?Co);n+1)hF;zYRwkz^0gd*3ufr0ukOm!uf;1@RRtdFzlI&&(_-cNq>tJHpspKr-75l +)vyV7dT}yZ7r--o4XLV8so#Ajda0|sP8wK-jDwtFtr+67O0y0-*Wq4b4`auZw-IZQ2I&?71s5}Og!0I +e1|_(U<1Qkx@x3uR$gUGs1hGjNL{xBohhbS|G-2FEC-fAvTzlg1S1uLm}p;oN)`W8EsG +|!uE){FJt$x+65T6XSNWBvb`n8qF9IJV0|ERDI{j0FI97C=AS~!hjy_oK65_ElN5i@w>36B;y%b!*rn1$M1Ld5Jk|w_V4cJ!Qr! +)7sUS_u$k>#$Ka=BuU|N~>yEv2cIgV-9r-NGTo9jK^kSwEv0R}6VZNb!2T|3P%Ag7EN5qzvg9=0G?z> +L9JKdSuu!Y+)(+ndLAqkspy5ZJwHGW}~qxSc)D#ff~k1^)sp%hPN8-p^jUt0G`$TuwxvqvZv;}DG+eA +_bGnZS-4Cf;az1+^vLY%g;wjMy=qS!qE@@>a`|zEIt@qrj$vAQ%+Hw+xY;z1`8e_t7t;z1F_(Xzk+U= +=~9UdvN&k!KUn +Wnm~JuiY7gA_jwq9n_=NfRc#4!T5PA@k~;D<{1_*AxT8CWLYtwCv0PH|J@_!LsiDN&h`jqc=G~sS@d9 +T2QyZ;*xLZNG&?Rk#pOpjkfN?JeEali#+qO0D&wao0szMjTSN&^pt}|68Ul2=$;kM?JrMa4_ErS^j2% +St+PmL~&p>63ml%hThIuL%=ht0`QA5Es-ol_;nj7JOo^67d$`lAx@*SI|c;}W5hS}SMkB7$M67w~Hq@ +4!lQ2RIGe^=MxiQ(H$M=330m4SSvQTb%rHmmOIFKZ_>4|QXqp+)*5WzZS0_zck;{Vxb|t**imI1_l`d +>;N-zjKq#hJX9Rk5KuYH!B`~HWg{u!qB3XIKtkmc&Be|GjeP&=d?u-<&3^n@O|cN<$O +@_?RhQIp4a2Oh&_0Y%s}h;EUH*k)yNB??79?!kO*{f*k)w}OBlAe$~Zj_m`ASlAwi8lIZQ1|lKe^eXX +cnCajpXYaJc$;Wz6pZs0#$=K>-+}J68nlq%%X;^!gz6ap0<$05%c6jL35iBk|a~XI)Fj-!AB0lxf{Q$LlXdH+*t0W{Yd{?;-yg-eBIYh~+TwULV=L5!yX{77AGzyRA4i~D +1drkWyCJfN$3q9egZHok<-4K=S4=k#@Jr|I%3Up9HTQGscNP}9OKM-)IQNC3$tQ7p$phM-b7o +C(5>#8srTWn0<7RV^YOG$m*M&YUXQSfd?%kKf-?@BFN_X*X5*G;#e07jlEv#X{{v7<0|XQR000O8Rdq +K~r*du{iU|M!Wf=ef8UO$QaA|NaUukZ1WpZv|Y%gqYV_|e@Z*FrgaCwzjYj4}g75#3&|6xFXpp?o~g9 +TbZg<(tQKOaCrnh@WM#>;*(??l#!VhY(ecso(Fyy!;@Df3awn=KPOR6wGEA@JrYzW;GsV|(%L|ra +Qm#3xrNFwVn4yCkvr#-DI_rJCpWy-}a&szcVks-n-eslcbdgxsQW++7XPDHPSvB8U7~X#Db$9FpIX+q +_xn_lc7)F#jA#Ss(NP>9&!1ejRFFstPzg>L0X6%HSea&Y~EGwz_&yonAnQr%{elqoENGwaO7IlI}!xc +nM*0SIrtn(Fzx&lk~>)HL5cG#EIbs>~Kypb4&+QR;?msf8;e!YHSKcpwa`u!ii{r)Y5dd`1KKYh8ny1 +e>z!tzX;7YJ;HGMlXA)iw}Oo2mlMbW;^vrR}=4^WvF1X2(Yie?!%;i$L+*X_VCcHmsiqEjLH|qP&HpP +1t*EpRkYK-zMx!g#j@_KKZ7uOX0!;+ZE4^RDwghU#>4crRQ(JWcv2<6FUofPc|A7-&y+i*n%aH&1JRaHZXs}oKdJ`m=$qTiaXAxq~WQN)7rZBbS|oClJp!lm?4{ +M`W>}48i%m9{=f>!brr+rc@A-mb%!l6S&Hfo`ZSU)OF7RpqPdx@DE~WIKzY@8tUPd#vK~V$mejDKxvzm8&3O0C5 +*^Qp&?DsvsaeQQ*;k;kDuh3t4C0nchxrr>0`bzyz8+~XxOZHefjyqCvsn0{C3zXt@kem@pZ05ZFGngI +zg8V&omc5J#xb48&MW=V~9P?V$g^glHgZS6>3g} +=w|@YYXw>2!?Sk0@oks9XEh(8j#H4|E)@tLiO<^sQ7AUzPVJMr^Zf_f_2 +JLk0(p+*AX&bfnBZ5KMO>}x%$x~ALX}(xSw+&-h>@qxRi1;`t;QLDR)aBoFAxf9HXid()<2V`QnH)UC +iMQP|g-zrhr>B@3#a`Vp@UG&J?Ci7JaDP#z!ML$!eOYr}V08gM|-cr_YC87??>?NA43p5xZlU?9z*2MLu*EWY=8R#NX%rSIhhWkE*hLzJ#pf*H*1XCQppQPrarln!3 +C?yp)-H6mCvLEZVhkRgp^T3NDnszV81M|sogxud09}}_c`g-M0h2f3 +QKh@zs=vhNnfSJ1tP!G(}K-l^ +ga$1&;9r4`2&`or9`X=VJxZpo%DkY`4ApV!b?PYaWvrT+A|G3QVBSk6)670<9s$G1aN(MS5h+b8{L$d +Z?vg2%&of+NGpMeHE_!@-vLad@Py&h307Y7m!#s*{5U%@s+MRx&M=*z%5$8g@2z@|iB_Nk`$d6?tt%x +8w26>)S!oHQe*EM(K}OpFExJv3&D-c01V9Xu$VB0S@%K@&h2JsftZk-i1BQD&Z8j+(ANzx|$%$Piz|^ +sAn$hfU3i^p1d?9Nn#<@^>fhZS8lr{7CEg%h+6d6x|UVp(J`%xszwh1Yym|fwdlk?bT&2It5W70dhT> +DL};kfJS4rR5HWOtwFS$36_B^kQsr76+1u3|P4T(gm<@A@Sk7)cB{61Nkb$ODN_GJy-Xt# +<72bfuITl>!J#WV^JL%y>k8R0ETAagrF;Ytg5wZOOYfZ*S0y&H#(?%lO>C%MfGn+tj^BMrC~!>XCqq8 +>{1hit7qaER8zAz$q~$|W$<#g*YrBq&>FgR96PXD&Iow~5_K$(WB7dS%yL&w +vL$lfGMhdAL8iOM`}NtAbUo? +n+P*L}d;E8A4+?eGY@m;36@vU9P)h>@6aWAK2mn=eH&Ty^1I8Qy006}S000#L003}la4%nJZggdGZee +UMZDDC{E^v8mkWEX&KoExSf&7OdURtQhMNkWRDSn|w5j~Vr!Zw*S1Ig|(Gg0#I-B?=`y6j<@-FfESr) +JlIC!ZE%71^3L?Uh?NjT^z*`)kiMoaRg!2Blth$i9~1c;+0&OG +XmnM!Wue5c4BxdSGlt|{RNzi-8hHIzF{@?uS9vhp2F!hguuI(Ns_!bBoMY|6y#5=pmq$dt)O&PT#Fzj +lUD(4jE0E=Ncd(88wAE08EqMo?s%l>7;QY>28yXF+9iMr)dV>+5JYHHz09+0OWO3Cv~*qO2XC@qGb52 +6B|AU6yhslr|A;we9If);U8u_5Sn4A$wq1eA$uGonQ)2qG{XIk^>!?3g>(U<*BV~y!gLLo6D0rs+xy?PKmBt1)34hP|9toE?%m(;P`;m8xVgR}@Ueb(DVQnk-TWwS>cb}JD)hpD)Zb%LamSp`s*-2TuCB;mu1j*eu{BX_DOHn +dZu_CB*NvNoXEf9h{+Qtn#tq7dCBzsI0d?j2EG{DI$2P;qXk!_o9RX4HUo&om5{}c12E>KhPS#oh%-HI&wlMAe)g*WWSmepzFBrJymcnbd0_k3TyD1tjRA_TP^UTLPJ{yr&Z+ +r?R$b7Ky}G9RN>(-ZghFJvgKQ`qx +`%4RXruSj2(^v%aEFCWm^gDKg&Pj>t{zOR`%qZ2A519hY;@k`{@WUNE?3hN6~jq#W~d}838JJlQ86z2 +#&Ul^2@jY7Ko!7`Yb>BVt=;7yW9w|XKh$Vn50Loeh^R20xH%HpFp-a8hY6?&i0dY6&3^qRgNXr2zDb> +K8rM%7JH-n`zkI(O_So2OwM7-!?mU_%EhC3QVQjf0#XKm+nbkTZbUdM)G{me=ltf>=9&th9{0h7blVvT +3A-{ZJ`?#S_5+K$5a-6?r-`VNY>VTw@)bc?G-AoPv=-M^w|WS8=+lp}`b1v)J>4MISiFVpLwWeN|$AJ +whV}H83EI!~v8q{rJV8fH}y24&W$^e&9m@Y))~j9PS}zEQ|RPv!N8y40Rf%6*fmX0RM1fp8)(aERPCK +Q3R$5Ys;s-nElK(1O#1~4j4R?I|_M2vKisvMkSf{ew+~y1GJB1qLPn1+mKJHWudac>!hC1SKkC4S2B! +ryyyQjW?}wnh?fK3fT95YU!P}XvBZ+ukrmLYCu(M_#7`Wh`%x4hrXtJ#CS9Q~?(Dq8#3R9Yk_sp&k*& +c7#TkkH6k!eNm{|o`Ov<+?ilGP=6vE5)Oaa!iUKGx(B+(L69uE=Ff&#M)tgo=NMzB8S$=D`s*TLx@aP +A@G0P%)f2^jMzu{GnyoCfX{x#ce7QA(%Du)|bH5>K{RiFWtn6=HOv31mjh33RxO1AarHa1rZ?3JC|oI-WQ2zB@NY +=uTsSVfRtd_0oM;`hIn67E>PUfPA(mM-?sh8JH8g7j@H7!q6>i7-wJ*JGFo@%o6lik5RPZ?yBJ_*Fcl +m7go0JaO@k;0I}v+o!(Qy9&&~ohNs<;Mb;ACHptxkH*aKrK^fx)G{M&t7qW2k%WlYhHfaBT^T*f4o8o +o0BAK-+dl<355d;B14$_4?6z)d!X1jG|zTIY#hUbfo;hSp}kjMjSs8r!V(oT5Blirx2<5+iaNu_O#HM +Q$(R&Br0ojmum{1ueH@yv%#-~d_;o6DktN2sAAO4GuO>3U`nZelnIJlh8e*&dE5T#Wl~3K+LSx5^vUv +wGiSp|Qwhide=1AsWb=^dWr{P!mVt7L+ttwonq$z{$S4M=17u8GM~ZJxwSjDC*)7mswQshu)B{icu}a +a~3_MIMY7bV08fw69=yur>esjeq=F}b!viKhn%_g64viM2l-rY@dLFx>{a(~&1Cj3>DXlbNML1^E$g2KFAmu)W~t6)3WUn~Sn;;ST>2GUI>^*-XtHl^Tqc$`PY +jPu?S;V5}NuyBAt|Sma3y>VkZfBesW+`Cyf>^I!VF`<(qa(aw+0&!K5Vr5=iSmi`Pi_JvjamK;2(*^${CM4?K=wiB@9Q3;*W!QeS+|>!!65E$0 +SFUqu_pm6GjzC?>&X5J6?0sp`oFmk{B785_crJtY^NC<_iXXVVi4S!6l}$N%R*i)PnWVGlIld&wSYls +P~ycLh-FhDt_QdvxCK!;TTrze$?4QY9s!?-X^3 +0h}dlkuNaacIx!B(L$*&MPiCA9YaG-wgX7B9eEOjGGR_jbNJOM6}w~AHT(?9y@_b|&869v<= +Y&ye%OT}vj>NKqJ3~2e87EGAjG;NN{3sP)YvCYv0x!en;7DTbOhFxD_+;Ck)$}Blhu9<;9+9)==k +Ko1AODlM?HD-VN=qL>8K~yo&ZT)SXv6aS((No+MRHUesLe1mvt3WO>~Ps%_YAMau1N~Ux+GVBC-Cc5U +{k(27^dN*AW$s1+k@O-xsUTqZ|JL6-=zcPWwv3@C0{db(w;&w(z^lR6M1!3?w{X2S@ +32A4+{v9!mX;BJH5Be7pTs)xetv*aQT3Gg#8TaW}9*vL&5v!=EO91Z3_(a@;F_4J%Q2We!>L^>npCF1 +QcHA6j7J)(bx%1Q^aNDTH|u-1_Dm&aSBBwX)bwC-5{|7Uiv|1M|FIwQBwZOsdA>I2bT3t$QH1(t9eA= +31Mz(m2wo{>_D3q$r)7%<-)Glu67*%>q)TGncupu~g&2#X!9d6`W~TkvJ?BmZa>=uVl#(V4*xR+Y2P8 +%7^~`d9(v&Jg|ivuBOGG~Ka2C|Up}52+9$ol+LrArrq8C5s_fXa3Jj;GB`SmD3jy60`Y^5lXC&g4;Wt +a5&NFb0tAj3gtpf3cMewXIv;Uq`PhyViptdw1#dOK@b9aP=iuIlCrjeIIv0hFgY^LXsM4YAUOs{3Q%GLqfTQ|1(LcZYdPjeHw++ziZZ??Bs*|JHE`vC#uOF{#X#t>2Oh +KUx7~7lp#dAin}hj9QFkS?7X#lVS`uz9G+|U* +$Uv~e0#>7e70?Ml1%_TPU7%%g+}PqVtul1N#a#T4(7#9i9{4Bs`6pBmgjE&TAUeh)t}Ax-RFA66)gcG +BOxx}H#cF3IW$l)dB(Y$l;jYXg8PFj^GBCtQ28LewPZ-oLu1kwIpb02?;o1iqF6r!hrTm;2F@)b +5tYziS2Eqa9q2lRD%-!}jt2>1cq&>ch>NK=Z6Kq-00pqHW9AbXz}pa22yjmvMVg8nQAjkr3}a-V7LXz +eTBekK8V6S7=}<#&qYqZ$)7)AFVw%SB{Xb5D`KjYT&TsU^f2&}{*hIU+;j@C@<2sVK( +^&p}H9RB)v`ys!14PcbNdHVs85?IN~l@300BR|=<8EhLVXyS!jp%_f-u9J1c@Uy&z3-VaX4V{qg*4U!=2@BgMPzsGXIdZR*C=JK&RLj{Xsu`V3MVq<2+XUa +pT>)bXs_b{i%^$OQc$CRrR8IdSw+tQPW%Gq*UxvdulZ852M&qgN#={lEzy#RgrNd7rZH7O2xY(zGES# +N$e#CJ;Oz`8=#CUEJ<|+;OWykaoI}UcL<8}$sFXZh8e2Kcu9J!K%5NvP1(%6oVQLKT+;~SFMm|wu5mI +XkcuU@#$W$j!ea)WWs{2@LURPo~OYy~bm?EKR*q79cPjAqN)3;4PidCg@Aut5&Q9x?_=d&No5JgKu=N7xg+hw18)~3?!T!T$WDi`Hk)sOU +JHY2I5dHS_FgiMOm3t|nnMQeOfwa;_g$CDQdME%LpWpEXhCQ>QGf4mY2>Z~)MN?vYCVzz6zK|>X9-NH +b3}0z8%wOP~k#8j*WoMiF&c0lY6VSQ-8!8kVu*GN+6`Dj$j<@`;K!$oFyV~kfb9Ct=#_u?_ii&ap +7zTr%J{t6h!+!P)h>@6aWAK2mn=eH&V;yKSYrX0062l0015U003}la4%nJZggdGZeeUMcW7m0Y+qt^X +>4R=axQRr%^GQM+c@@nfcyv6#lRBA(N2qYb~k_r=%h)vm|p0$m<O2CA(b-QAl>xRBQIUlr1lcx8hTmH)1WyRwjoBlgZ@ +p;P4<{*HzQ9qFOEi&i<}sQuB6Ye>cK@m8-7J3;Xj+USH*fKwNZMo!3cvBg(950L9{(Bi;l-B-0=ZURG +tk;6?sLq$OXAnZI-+8ktw+PK0`oLHWGA0od%LTAi_v+fiIE(?-auYZk&%^fU)4=9fSv!nja**@~v*MI +t^gM2*j7aOU4p)Mp?9#mR?Kb~Qd1>d7dwb(Mj7k|Hm!4Yn8Xeb-*nsM)+7b5#p42P88gWANcf7 +WLx?f4&2fv=B?a*o@&)PeyT(<`ZpS1~xAN^C9rXj9r4!U1$_&mT!gZiWcCAqjThQ9B|u{3#14gPBef;dtR~>? +F(9qQi{208solHESJFJRR#Km-Hk{V)w%}fikfM3&X2zQaP-$Sx%fUl>VMt){s7puI4wAFjBN=NQ-$wc*zXv#3PrL8-;_j2XY5i?aK|tW;^ +V5ANUXHLgV8xa$5?v69!-EEq7;ytRdT>>w&Vas@|JP1vbAVLv0**D?BTU0&Uhh(cbbXx&ROuJm#DLjA +7%atnV$ayKht;Dc}-E~J2_)nC(ulI(FmSxfO}g&C1m5D63Xm8ns^({mg-U3?z21rTZB-}vLOFwm- +8K8aNbQbGZ4l;PKUh^_zRatBdil`@SPBh1fLp8DsrqyD=Vo*^cdAO! +xKW44tuX2w2J1KO9G2HL6go1)2#%wxk4W@l9k!r);JG|}@1oiP_;oF|!xCW9r8@0&!*gAyV$k(vtDOUy7nYeKCo{>FL@g;w>D-$HJl!=kn?$ULvtVwB*(;7yi;CQsADD@ul=qJMc=Aq +}M%A?mds?ZG-j~;ES63F)F10Fm5xX2a_;sge17!cB0>7=DE496W)om>grzx)2yp|}hyIWU4@fSEBfg?I%BjN|H2G>u7s`@y(6G +PSR!{}whWlJ(d;!7xfY9cp67pF@PV3LU#Q4~}<3F-d7`=o}XR^pGlzt`whZ2xi#Uz-C4$nO*zsUi15~ +2UtQt$0t^?K1m>AMeVTiM^iT!0?9w}8VPhn0A&$Yhw$LXM^sxO0**L4 +D1%_l41Shr>6e?Ch7%eiVl^FUcWnS8aM!)LJX%qx4bDK7lhXGvv=XC#~PZVWB57=#&&jU!FCTWR5~!y +)i$8{%|tELXtb{!`+dz)t)Ar%Z>2|O_DITn%P^i~tQv6IqL7%Ld}Q;Gy!klQV+ +Xm)ocpRB?ne1$b0g&>s73JOI+5Rg?G%)n?S6xxXc(N<8$wDOy_GQtJEx%SU5WEy$oBpER$=)jJr6AWe +3>Q0%8vFT0+e{|1JYk_`}CP!pd|+i|(h7=e?i|=U)NsMU||?=PX| +Wn^F8V9^cu~uQg*#EmJqmj`g%EnOISdcGsuom7%e0=TI_U+nCRtYn-7h$HIWa6cjki62zdnn&I^nbUo +7+$9ufov@1LvgA;?;f7KO<=Tl}fyEQN9H)=4w>ZnCY)ei>SYcTUp!9Ga#Y58q74Q5RJdq3b~+g}RuZ% +MWW&wV1FjZU6PzU@jh2WD^W=xnWb=SDgnE3|{RkfNS$Xpe7IdUWQ_1EKdL=g^3UHMzigJ(`}8B`PYBZ +e1nk%~q0~^MWyP@KS}nt8hy&{R+_7t1r6l`Rc$Jcm2UFn)9wt(4eVzH^;lP0_P*pnT_0K(fbv$TP%dg +^lX~Yard^O-2;b;EEd7YO_cU{tDWJ6!TH4u{`w9|ac1w#WHPk-9>>&=c#`aBQ5A)niRjyDsp7N)He*w +jaE-YUApF4a?$R4Oy2>f^1^!5tbN`Z}cYCjlg9Hurt~5OuN)1|Ej2(t~1F?mQAWFK!_TaX}X}f4KNJ# +1ljgRKTafbULL>BMN`oNxTq?VEU)7DgY{78zs&py;R!qJvjUXwKNt(9byJayqXr`KU4=S{_^KV>YZ6J +&*xKipxeFnjrB7l)9+rHg&hXj^S+6`%0BhVFvyUV`*LEaQ84V<$ei@e}YYPzck9{7G-Nju()y*UK@}c +WOK2?P8%z1)yFSa=le&T>y!|;B@p83J&8!0ts?nCH(^S%JLk#YFmS`ZVxiNaR`!r{Tc +08mQ<1QY-O00;n8bvIHFM#&m&0001p0000T0001RX>c!JX>N37a&BR4FJo+JFJE72ZfSI1UoLQYC5%f +B10f8>_DI~}i7tAe_5vBm%tQ?d;VkN2C0qi;>+XiHThxRrrY}?Kw8Dm8?L;7-EzANtw +}EX>!@Ra11G>7-D$feapZp`cG|&+rE8KoCnM&q&DvpV;$AYQXVn<08mQ<1QY-O00;n8bvIItcm>-42m +k;#8UO$z0001RX>c!JX>N37a&BR4FJo+JFJX0bZ)0z5aBO9CX>V>WaCx0rS#RSu5PlDk|G;J+Bw-cp@ +tD>H7HQB8_DHasMNt@rq{y_*MwV2PO6-5%86FZz%V}Bxi6xOU!@0hh(b?JA=XT91A~&TZUHe42AZ0Jx +s@--qm8@+DYlJN8nl8!xo)ksLIx?;nMRs~}c6N4pa(cqHUCSkDJK2?7(D8*BZp9w%SG?U4CMlO~TMJ^ +As!honWTTcrN|v(*HZ^6PRW-}Du$(K#d?4Yplr(o%rm5TQwrrN8B=ejvStV1;#k`&5&`VZ}Y|BJtd91 +0-2g3j(AvwG6(IVm*4szeIW^H+V`SbSA{PN?~<){4HkFQ^^zy7YQxSCkFI6Wb7DaJmN56wO$*C3_5uW +3p?!%0$d)8R?V8u^``Ea}SiDUB1u?iKQ)7bH%|`LE<_+fe-;{CU+#z9+XWC_q*%cRWto6+w#=FcuO0y +|Ej*9ktH}7FNb@Z4*h$fD+KJM;~rVf$v4z^9p0D6r0?UvSKwgynrIQy}r#q{J6WxFK@owe!jZ9ib&H+ +h)syDj5d#qw~f&XFHU988~t28wH%y3b9T-nWRw4K^X<3q(IOLF&19U+-(4&m5}*L>;{&QoB#Rb_-U?= +N8n{rEGH-^O+DmJp_5b#DN3=gFxI74gg=mfsAYtA{H4bwuA#@}-f`ac|=+Nw1~O2~@|6)32MBN +bS5v|?pVs#1Vj(T3JtbRIb>CBAj0&J;Q(3(9F6#GX +fo=K{@qaL6>eWm;t&M{wXUf>ubGVcL^>SL|!yppx0)Y>1 +8X9JaClfN>?MARHku`gyR%?~GqXmzZ3cN-(xneU@aMG31?L^d40H|70s(;ge58iYVEDvJ5>GceS29{KCI_xnSR`O>#3@rUGBC4iY +u@&q@PS~!u*1N09J;DYDQN>0)(BL?T83biGc$XjlEQBVj&u%z5uGaF%bBj%{|ol@S#77y3YD(7`l~Gq{?MQXC-1>3j~e`a+G`6H^on%)diOK~Jb-38rj?lunGrMS&QvAs!H3-{3 +9{^*G}UCc1#cD7SVXBLe$=7-^8d8E3a(1{gygOU_hy7R5Le+iKx*`7cb=j2tjgDNXKx_8=t?sH+XF%z +$^H$M=f^3n*+@t0ie?ou1cm}8Rft*hy4rm2Xjbu$vgKDT^S#m_y# +I|~G4)D|J=Bwg0hIo!?G(|(;ako^0S2)_HZ1(Z-lvN29M`&)G9?=u{3x0?u1_oE1oo%>{EJvfM(abTs +L!|e4?r=YGy|`Hkb5?cl@K2@Zkg#5QULWhjhz&^HZ|O)(^<<9~fYWtfgKbrNr`d%)o{BvDs)xacV)VI +-;%Cz0nE1p5)xCh?>W~@`J4T;{c%T<_9;$GG)Vrs{=eec7J17N{2^nkcAqkb{$_SX22@A6M1HftnmX# +RWE8i?=kvD2g4Ky24*sknTMPWV^wIV~QCYCI?o3D8KNri&5wY(Sj8xIVVBVQ_Y7pw<$m~2X11XGn2He +%LNHiw{*Qtx9|YKrf_#e5(f +ho*8h&a{)P+{E=61yh(AydWcjQB6yl7IfHwVW+DAR?j6yaVAidsto~p?isC@qxIZI)^R5j=>MbSzK<* +~KzfAve*jQR0|XQR000O8RdqK~{?5kiG710yzaIbqApigXaA|NaUukZ1WpZv|Y%gPMX)j`7b7fy+Z*6 +U1Ze%WSdCggCZ`-;V{$8N}fp9QbKCso>m!X(9G?$(lZJi)>dUjA01TE1H7g^FsDUMh4zwdcT-7Td(7; +rG5Xk_x`d%sen(dbkd$i$JbLa7QFII@z&Qr9M}2CUq<#KZq17K!aTftSX7k5G0te(r_@7$%m{wSqORN +RzIqTMLdYYa;@u=B-N!Qdu4Z~>?REb6tg{-8<9tuc_*XvZK8J~1DZj+CKFk1z*#6wiQRkpgyFfkzP`M +ky7#N=i_eS8n@{}oX7S;ipD(U?bNgobetG%ZvbFYkalN{E^WkFonJ+I_{O#q<@*G=}URLBoAe|CBOq` +0aP*Z`n_;sOmqKly>HXVrU(0L=MI)cnK?>ipGA~Q(*S6*`X)Y1*$0R>WiCu +bG-azijU-X44*iT8i%6hng)R6hygAW_)ghJFg$kK4$dz0=_5r+I0Aly|WAh7D_ +f)QQpSrvA+Pyzz2%F|XN&ch_&ybD=s9AM>Z1LS*YI;&VhL)4%=`qSAdjEK$Rt+QX$y?IZ`^M3iIvdrX +&WH-qid1M)uUpjH~wTbGa^mxO}ZIVYJgPK`U?^%|x>{glLH`}5$N$ay%wJW@k9v)CB!w*ENGMiP&8yq +iY+>rsT1zFSJaG8F52l^`^_8JG?FS9e0< +#0_xJ#4GdS}vWX`kG@KmF-%=rVfPS{776Je$$+sht2?l?mw +qz#24`QS`&>@Fuv01NsXBjc<=5c-p-Sj6Y8Fi2F|E6z@lc@l1sj$5`uQEsaf-M-#Frc_r~zo5c?wfaT +*tYNiKC?v}yTkKG4cVJJtUa?8jx*8`k1?fSGmJ+gpqh#y%7hBqidJ}#ls3v1PLG#6s#nI%TgIudfWsQ +`k(TM4|>40@v<(83xy%J!fkUXOcWoec +TRA{y$1|!hVx%mm7>wsM5;jPnUw%5=xiWbBoN+s(v%Us@{`d;H8Po4TrgQef!?#ckI_0;!Cp(EP>rb)pu(unK5qr=Rx +6I%8X-72srEG&9Sh2f7PTHFg22||&%^neJ*jO;Q3&4^v8+T8ay{8olmS**jn)WT2{I5s~)P$a2!Vh~M +Ll2pi(ump^i8we=T?CfFaBOdFM^OAV6CfTf7K|3n5CfP{d%ZSJMZf*OI)(q9DgB68&n_#C7A^`?Tl<0 +X$vs~!F<(nSdNwt*x;(#p%~o(L7!G|V84Ti4L8GCBBC(iKtRZc6`9~9hdni9p0)yExdC +*CqOAO46X$c{MU$;pVI_&=Od0WrWbtX(~Ht;M{wTEm?bGETJIWU}Sru?Q5s5=e4s5s5DPHw3g`7*v*T +=C^4Uo5X~R^zX*&-lf70GoV3C>bv76~GTrUi@?MY4wS}Ia@6*mkuu*`~OOiwR+J_257d%8jfGqPQN&p(-n2|2 +-t(6-?w^uSg@yExQCdW(WV3nJBeK$u#iVg(SLep~Bu-$zcKUxJ{YLBBb2nGoowRAH;ClfJ2F)dT#qOAIgjh&TRw<9+ir13Hp$U}(bOL3dPaRG*y9n1XOqP9$9!eBem0v~BIVy1h&A5}Zy9tD +H>tu&YF4ZX$=-3oq)ppcIqZ<7{2nyjdk4pP8i~Mm+k@=quKi-Gk5}i5>u0Nrk5|v|&WiL)XW6~bikxj +a$bZq|9H@q^6@`NJoY@TXlWoj?lH)CmgBmj*y?o)n=<^=9cP{6Def8>9XS17##xI}0d_JRs8KLfv(U? +~5vylQlv@~4CHiUXwNGcpQJ?yO|s=-pG66GNd4y +?isDd=jl7nd#adlf}U5HN$J3Lt63Do!!z^m*5HT53BUOx$OPvKyqCussd7p^Gt78GB6+$vk&{O4C9Iw +wz-uK)vNYIP`x7uub(t&~L7)I-))I05zHPf`xLOZ@uwF`CS8?xw}2;LB>4}_jV0Si9As?cx4~155Q6Z;{%dxnQduCTqkC!!tO!tp9Zslcb5xI;r`7=VxB3 +&q`NiqYuRSeO_083{OmOJTJ0|i6wEbQl)``#|P0d>8X?LDD@{3C}HtsGUpsW%_G`AdV&out?eMJ~q;r +$WkHQ>(@ZGE!+(XEcn%7eF|iS7wC83sd$imXRGb@?b`=qvv}Dw*9LF54U+604!OW5 ++qA8%Ea@aUsjsi!{ml=OA}Kjmn(o8l6=-5h>wAKB?AmDHkFy>Lkx95oZgrD)VhoJ$>@ +@$<Whq5ci8>bxxlA%?dga+%j>K$Ri$7+0{YQ~xRUKz_64z4HYq@#)WR>Q#I8Aqvcn| +$b8CQ8GW-`fE&>*f2q`RbEi+GM-j>5PoWVQ&!JkH>MS?&aYt>x1vGg;qBnTaAUD_KRNNDB2?tYjw3I5 +hz4yJQYnXSFOdL|{Zytk(H9U1VYX^hps{H~|J7iK`sY5_9O9RJF`%XrHDQdhlhLr)ho%cmpjKvPxE2^ +z=!9#C-bXnLwIx3!L0M-)sPi8W2I3a+BWz#bMG_z5)8?fE*x*gc8eby)9*ga5lSQHvz25WL}SX{5U=O +bDUNZ2TC?YUIN`J^Rbp6>$@^8%!9kQ%m4>yu`Kfqz|Q7%o~M;i?}1{#qEx+xA&7+f?d31$=NG4!m(#b +WKb?=nd%{5feuE;SI_hzC$Aw(Lj1fnA4ZMk_x4_4|jEZ>vAzlGa(Y8(+M1a3}mdxWc`KO#_@kY9xHS? +l*nnXpJuS!`}(-|PE0sMG;F}?ch`RQe6H~Dcc75`NG6W|Jn!D(6MWoMT(pT|y*UoKBCrYFZIZ%?PM&n +`wFX7#ix=hLEumGH3>#wK6Lw2GE_xrys3NK{?ssfPDwdV0bS@9Umq3;9v^I^Uh2-PgE|OGK>L)oYMw) +#-{Jp3}3=&cuso9an2<=6iW{@&4VL>D%MWw|l6{y*5cT*L^@%>wK2)nGd(GcLgpB)#K;Cp8s_UG(Gw6 +>BTSa-krUBL!!OxcrkhUM8LmJQDvDt$4BKz{2HfQSy|29F^@CQ0VlAi<5>zy>oqJdE!A;45?5PLb%=% +O-XViDQX@>+GFjO;VE3m_Ku3x)PAWO&)jO3aZi7OhnX3i0sa8WZxo3!~oQQ!tA-(i~zC$toLA=W|$sI +`P;D-ww2Q-_4O3D!DOhbw-edd89#$p)hIUbj*N{ug6n+Za)aZn0A0 +6d&ZSvZqS`vSwjuIdrhGXAUH_P%=VE@2+{s8%0o1U|OtTmr^Y>CO1ZOT=-GESSV5t)Gy7Tl8IusZdf# +5%lU^X$x@n5XWJxQOxbo&V5*U7qrM*DYG`qebwIPOuld1Ed;PplDpUmGZY?G5NJ~-3a$Et9MO5ryYqE +BKu#^P6F-vCxWQ#ZY^@O&5XW1AdBp2Iaf%b*d(U}N$w|daq5n=>3m8iA_$T`RdP$}M~H8$}{U-|1RS- +NAO^@g*znC8Ae(vb8NkteWwpg;_=q1DfjT5BakYFsN#JH>5)5!ZD&aE2QR&}zg#ZjYlN4%Y!QUNs9wB +48P?pJ*A;k8aGA<7_wB#IU#-?-9ct+Su#e*v!}4rdute1;_~+b<URi%edlNB41+tK^e{PbDHewijTh+L=rg4pgcUBmYSuP&D%DUDTqdyUUSxc +ZXG%aZ{>D7g(jK|yv*9JQzz=?&wl6*Q%K@WiRpr~E9mmwQqVD-W-3_Ev612yrg<6S&Ux*mhIkxKL>$S +_q6ZibplB$m5ro~1j$%P}tpfa_p55}(2e&~_4jR+3xMq!tpLED1iItfq?g0AbL^z_VokaO4aM8&uN;i +EI#GWqB!`ak!zu{h2sp0ai9Q%1eHirFp!ll<|V73XA@g*nkMpIN)Ld9#Vs<@@+Yn)S*nkB{gm>J{ebq +oF~geB|(L5{po4vCwO5Df}tO?OL0^M2Ug+LE!gD+@dz$ka{GF9vGuI;;(-ag8=7+=7x=a +Fl;)pmwI~P_SH|Ld0y-W9nG&@fH%;6KZUxx1750|$5x*2v*sU$leA1d^WHptvX*Hv1wbksq$F2SoWF$ +QHP{p&WY{(wY16Q(k3##2j@#MK@bgi4xz6wCV}#F#4QI6@ejP=THrH<`2vFs)Jmg}Ep^f{o1D&Q@2R3 +ej10!&e48Q<^U8yd&vgt&YH5)rN`qp9&F18tk8xwNt^auh+09zfmI`X@-+oa4h3jN)JxrkHbT?iM4y` +qCTIhEUzw5(QK!=6+s5mmb8(U?rz6tbAFFZ3O+%Ik^ +PHa8a$zvD-e~z~NFN>|y%UA(M-$lCW_fi$X2P+Wfokm{?>*Fb&+~0o`zXI~1pQ5ND?u2*n8>$vv8^K$ +9s%|*7D)~7IRuSC?HQT$kZn4UKxPKOwBGSVm8|25N?yZzSq{-~R7u$a@w$#?e)p^uks4Vrv@R>!&H|Y$Ui8;y73qqyE +L`I=r=er5O$p>bHjfARvo2a=nc$yL4<*{!Eor2KWqf5#eqw*(sncmI_w$&6S%9uuG<08uS4-CtKa{qk +Y#IZFf+m%F;HVq#J{Oe!v_)+c+;YzF?X7+5}KhsLm$S=B$fIb7*71s-a@Sh8(GJ&mmMjS$Rf4#gf+uC +JVA=YLaSpw%tIjqn7GgN)Nx4$Vt!~>dkqW&d%gNV!3OGLt3P_sQh(0VFHwIwb_gP{DabK1qxYR4bp5# +NBmN(EExB(VvA}~p?Bg6dVjO7MjRlXZPaV+-xkk%mf~TQ(i~qWz_Ypj~#fN#>dqQA~V|47`lvF$4XmB +3#w34=Z{MMP(&+*4(v)zbnyP08(XDKuiGM=x|C(a~CqSPsDT-Op9<~UY?UVvu(v4$M>-psIhen?c&QR +8;JOQ^A$hwfSnD>-*b-15$UBvrSK9xW?*)e&p$|>9Aev^HVg^70V?#K6K4kxHqxrDro4^@E +f3C$5j#$s^2QoYJkvYc-I`ALF&`i;WxUw&5SB_Ek9p8B52^{!5X-^Ie%-Z0*t^7aSRsEB{BegrX80ox +Z=4~R&e!%sFLl9sV_4e8Mrjj8e}2!?k2?rZO+>+Hnwwx(SE`tMRZ$2Y(Mn2hm?+0Ybj2S#cZ1`QrUaG&C>+jt7&iSsd?8V8aVssqM3 +~m?*7xey!=Tpc!A(CxC3(qn@V784t5UQf9Z%J=Fm7UP)92jWpaz;`5-C6N)0SfsKL)qe-<2??M*sLDw +uA|^pLVjSW8j+F|_Be#jZ&Bn@vXpw8j5lE`IXqh?xvgMIlD);!y9$7|aFegPI)Y%c%?EoWmpHj4~oxd +TSWDl)J+89HsC%$A-+2QWklYz$VY3+%$_w@ygp3NM#b9cGu(cvmu4;I4%rUUkO_bzDeVR ++#nZ>+GwkIBOl5utzGLfo*EKALcfyM1YkB(+j`R(t?JZc7FX}re4UDtS$&EFA+IYkr4@&1V9Cd(70Ec +eHXsD;m@kEY^i(2o$s9L1T8il9mI5&CV5-yGQ;cLIqOkSwu&H5(iD^Ck0uwVlBW3PVMhqx`ljivcI#s +O27!3JrF;0{0L&em@_%Li458cEO%#^@9O2U?`CmN*MBG!!b2q7}E=t(gP*V$6UtVc@TMo|G|VqI@iQo +JJ+50yknmOIn0OT^-Gz6Q@46v`GXN)RJD*%1Rg5{Op+Bwau!O7Q4zoel|p6}15oPOLKsCFqAuC(oY~r +kD#Ef}A!AWhB}_2yJ9PVQp|zO2*PffFmZ`wITeZXZq{OCHexGkivqa&cP_(0Bi-h@D~M&3CM1Ran*GW +&h(cH3amW^X^fBpUq}LboGNI`Nx*UvbcjUo_WkA6yW^ivgMOOm=eYd9DV;bN@&$iSRH9^3(m^4kGZOM +vBCYf7YAuqwP2NQg>_956<6DVG8n`Evbm;T;>gxQmi>B7m-J{mtoY!6huD$lGp}xlALji8BzVJj3qQh +h3QE{*ahG@$^(0eI!|Jdy)SItDH`J!jyS9OWAzo}W9SEf!oK9}QYl?t&l=a0a(q7&T%qLi2oHH+|L +oj4k7+tOaYn>jGVnvf89JZJGbRDCog9*g;;pdc2H|flBZ%U$n5UTfZD;=>(!XZ$YpD?|enjZ8otyWq{-2Ci;W`YU2gFMW +@rZUlC_5H|Vjbn$sHk+!+9YQ1DNRbi%+=T1gtilj;m9(RRW~_D6h7tSVdpsT^srlhK3>kFy#9f|~zJx +mWuekSoTbAft0s&P2o@Yl&4v|W3R?ol{fCGt@ByY#rjvEC*@CLIcgqJA9`L2=4rSeh&J4CKyt$;DjX( +7MsilG1tZc;~`#OYilY9To(SCPVcvqf%C<;Qutg^5}EQ6a4djLiJ3XK3c@r+bx%)#(2zX>2ld5v)a;M +ph2*U!JV)Nu8r#ZvJwYHEVL0f|0UdUGVT&TdrE;*yd?V3t2+J2Q9#)E_>D;rDZ+5&Q0EtO081kc1oN#E@$1ahz3w$bV($R;8B@L8y8=^cma{_VpDuYI?J(GlNg?;&`Pu +{IPVm9pO?05fgB*8}_ziPueSMk|yrf+pXSG(FO_uGzAKikxKvQ7(_GW8A)<-ih#5~Fd^6@I0|k1TWXpWSb!$_sHXEUwz$*N^dGvRX{f2L_tj8#1T&S`zxp+18LJG%j^gHqrgqMO(+Q?RvN2;p!EEJmVhqH;n%n#abYKNErUca!)l+;Kp +j4+3nUWT`(z%{jiuFAH)emS|h(dgFY&gy1M2v#tn+zddjXgWh$FZc;D=Lu>%8+Q<{Vx?5_ebl54$tI# +nj>p7QSm-NRHl);DUAZ+}c6|zOiT<8$g^}yGG&BckKt?6j0=T6Lj>MXNdln+PDfem|BVkRKgcpfdA;- +Y{s;(sCux>Y!6Y=Q}pbjLL=ClVjcyPf{*lNr@m0W5&A +pvE%h#jWO?bVKSCx>D@uao=rrwRYA@0zCE(KxY!5VS)^&fo#4S- +eD4}k1FMFZ$osrOeUBA?7R6^z&bl!BncfbDtssia276pb+f7{{DIevDbAjiU_2qST(N{6+4r~^;hCsp +LoL%@=G4;f{@M}o{$Sg|1r8L)5eo4IbsalFc4&o>o!4>3Ej67nEZp^?i;?A79*)#__I0E(4Z!Sy}-Xx +OwXcGG`<8G6UBK@YCjd_cH$ylNQWLObj!);tgM|1Ju~%TlNDpRUoOyaACD;2<=)!F +8A|xPjV#nIbq_ZYXmAp`~VR`s|K$kaBfD?HRFT%hKkIqJthp@jo{fUx{H0mf$_Uc%%roGYlYm`)Fs=! +O_7<@z`5kYnXazs-V@AcKg+o!23xsz$s9Q?EMvyZ{YY0ycGWh+O0eyVrtQ8$X`Gg6KAD33SRLBud@6Sx>7snRIUbJ1b&S5#_jvf#H#@y`reyH#s6 +ze94$gU*&#_KKdESkmgEkP(iz~G>UG;gG7GR3NV3kjE%}exNpY5|jd=Qd@4@V3b7g!ZrDpn+|4i=maQ +FxGGe5?=vq_OH4hSH$sT>FgKUO+d{-*e`b+LbUNhAK2DJZgpmgIK%;mmef_WN2)VQs%84F|j~mbfZjG +V95eDwByb&MOK69s=yp^1nB(ieERNvBaBD5*qUm79=zKZR51rm8Kd9|o44EtHbUGq4Kc|*8+krdmv__uE?uoO(8s=Qp#)L$FWwB +!@S;U(*Tk#rRb5mi|sfeg}<1~Iy?`teUHhbipQvAO&_4>LmL}<@451ANqsi%a6IFgQWxuElayn=cID) +lksg+n(=O%iTd2S^S9xw#V~rkg^r@Rp+^dw6(aBB^^kI%VdD$qJUie3#fr}A8+;aPuax-Q5K7l^53`{ +j3PMI!UoNB#v=S5oC7gf@E_FVNMY>*=_jYi<31WbtobGYN`9Va1Cgg;^*N64+{73|+sgYoh|n@F}Qd{ +WCqy63VXX~ouI`2&-n8XW|kr-dxOefizLiZuurjTxiIn1jyL_F99NWVHFi?z7xRmZ7E}YDk?%qy@8OM +LOoA*&4NF_~j;{*|5tmiDtrQE@PM;21yKZC$u~);J{fHHxXfpO +%}zx=RPq4TKKTfB&Z2>&I37471%fXb;c_#@e~RN_%(j5hi<0hYCbTVJOM}A!1kAYBpbeb%=(;||vWbl +(;=eCHqd-Lu4bX&F@Icj9Tuz2+dKS1B` +0=G%``$RIcLr4wlqVZ^RtF*ZaU@*<6T&dgNKIci0M>HeS8wM2lHT?xB@{5mvX6XSuHh6P#)rK%~KioGFz$P<2@%HZ(Fd!GfsWNVa)7>}HHFgEs;g)1HeKFx8Uq9;(WtBJtx+gBp2N;7P%WLRd9f;pMKl=bDavxuhZ@Qvhee@m$Mr$mv +%-$Iw$B)o@(PjR5Q&;1QRvDRvjKO!7sdF5x7kv4))g7zN)gODA+>ImH<7HYd}ro>}tsZD2Xy#tG4hFQ +`=)j)Jn;@WLU@($w}ouwYwnO&eLR_-teKjvOU4AB7Z4}(^WoMBrAypmg*KBRVRwiIHZ@Fi +#4cJp4A2wtk6Z|>QE3tQCex_XQR0$6aOgz%QEhI4KnxXvkD?O;ZPi9q_OjI&L-hVyzG%E@Nk!4{)d@ql@FeKU+$;0DZ2bWsIuG@1m)Q)N;mmY->Q%DN6KoD)44b%96~`{X$Q$~t1^9!qgk_uZgt}OAYHP#H$rxk^dXlbC?@OmYbx?6Bhspg74a%YvaplyxIU#UWX#*BE~$&el^aV+ +^hQ88@nq&ml@+50&MU-4%%Bm|U%TA>$&UJ%E_UrxYw6xoL+N(blXir*+tSpehBNBVcu*Li3@JNHUAJdn);zQruWI7@@Ln}_*{^Hrdb$=`<9GtoTt@6W9gJNg8hTxr^hLg#vcJIu?t +_~NGF5+3p^rb|W)O{4&(>8e-2*&E4PC-I$B^klf_Xnzk#Y5xAh;Z&09l}n%&bYb;!}d^0m=YF8(_~)m +!Pq>J$x1nu&A~!71YCOs*X}ylHm2aKU2=s;WwA2ee>d*7qAC_dkthp8)6w(HJ`8DIHWrz1jtI)1tc*Z +p^kVT#L_rW8~U6TbdPoIeqX{N*)(h9;z87Fy14{wgZuqx$>Fz#nhpW&ixw0u8{9fcs$=r{&(FDkaPEO +ujoNpJV|5V!#X$FNaf+F6#-RC=L!T6tNvTXks4@x_Xrr%8uwx>uKdwRdl-p@w_U+!*^Y)$C)=PC8sr$ +ssJ)>)St?y}Wr{?R6L*4NG$DM-#T|a3(QMWBxPn@d>?UvS+H`Zgk^UeO++*xNo_0G^0y7bt3wAV}by5 +XJ9?xSuUYPIoHmG`E-d{hGvs?Uwsxqo)6xvy@Y6uB3}^^zrXwVA^a=h8Eu@6 +aWAK2mn=eH&QrBuo!az007bh001Na003}la4%nJZggdGZeeUMV{Bg>N?qQ=@<=6xuVd(Z7TUt^|ZPS#Rr*lCV +m1oJ{F?M`wg*anpE`CeuR3oIhK1(8Y>HKIGGn(k1)YqtJr3(yQI!FW_@#E@=8M+_ojgw`FZA +srj%V?c6=T-Z82KJCwO`y`GC6peAM6gv%)F3kX?`Vj0iSH2z-nni#_lW_&}1+)QMXJX6MCGe3PL;Sdu +z_h(yYx5fz)ls-Ao)kq>vG6f}y4~D1m3;v0>}Rx`Po3LUMagVkw~Ml~n;M2&0oYJnNY~mKM#Kc^vr~z +mJTU&>ic{oX`iM%lgp$h|c)A^on^0a%oennkhpE40j=Qzia2=zgQM`Go@91=EBx5>hGSgohe&20#BRc +49#WZ-E~*!Hh92Z*A}0l`#;b^$t|X!dWp4f;gTk+JwuvYaJ$M(fv%M3NguV{UHJ07KTt~p1QY-O00;n +8bvIH=V4+UL1ONb03IG5Z0001RX>c!JX>N37a&BR4FJo+JFKuCIZZ2?neO6&><2VrgUdVsYxg1R(aoD +eg9xT1yZMj~zl-&75@vN=GvM+=X6C>X6;u=|Ocj&RKWTybnt6Ei39AB`$w#oQGY<cf0PWdnwpJU!q0{|srrmn_XuqIVQb)omVxWulu0CB_dM-;(|vX!P`f6q&)^@)u5C;-7(H(Ye@?crkXH@Jezh{19T +RI2z~0|F_b_S}L=#F9e_0QXX?mQ0A?A&m0nry2kCO$DAhPN#W*)pfrz=*+HT>^ZWwN;#MX-z{JaZ!U; +@d5J)o4*6ZiZ%*7)&k&82HL+|^GR+h%jH#K+=IKNl^_`+2mD&^iAv*0$<3O$P_;paZY6qKG54$Yw)`d +mAWKE}kkDj9yhDeCz^Q^DG-%WX>dO#fi&75h-i-<1+z07au+PGqt5ax8PO9B%9rc85I^`hmHmcyyq#A +LBIf55h|;^?+HY84&$e!$a+O}k|)@>y0?aA!@xYpw4_Th9S7tS=H-(Q?)iBp7QZo6NR~Wy;f;I&F!C)TZbV7P;9l_z;K5#d>eCrg4t+SiQ$Ip+K;$JrWFPr_u)cTyON} +jrRRuI?p!|cH0JyFHoiYb-8IB;t*FFd#%zcHmnH%|ZHiAOU~ilH_-Lk}lz+tDk2dlVJ%6P+S#2}QmgM&9cP5H=M}B`W}4kL +#>TNsG2*Y>pe-2$iX%F~af8#4=1^s>`rD75=|LIFTaBCQYMLz;<3k1_N6pOk#c>pRXGYZcH8$N_P0s! +YP)h>@6aWAK2mn=eH&WHy?-ySL002%4001BW003}la4%nJZggdGZeeUMV{BFq!63z@U`Zg=(!pci+=Ydq>{jTs5VrK02FEPLjaqwqO+LAG~CpwB{X`?OUa5W-Uc{3Rl%N +re(%3hI3Yk+$KL5KVD=^S0;*=xamMg#6KeFr1=7{GOj5VZ@6X> +#$hHgUQ)#jLQHd>*6fxKh0H3gx;B~#2b^Az452JDpk^%0y_;EBM!Be{XE1gKZX0!H7Fdo;XK&fhQ1W23{8XMwX!A-7(3#QkeUC`Ww;U0d3-K?t*)bZ^vzdpjl0En$9Rcbms=)+@}_VHo|rOJ +_IQ5;X^UBovDjd#u)KC1C8Pb40E-B51j6)RC7Nh0XR|MC5rg+_X$~_zKy(DR +)bSjtPu{{Sk>zt&FJ$m&zjSpp0da2A*MZ;t8O+!2twS;z^jXp=b{Rw}}GNN@1OOe#gg4R4RM_`R@m8sQd$Z{OTMw;Pa~t;S}%?e6CVqivL(C5)|$#?$VnJ)Gg-kVW +WPE_pMFV-o%x&+_ucdgAAMK@#s~tfG1EMYtz3I$;Oq;do1od(@x=j<>=rrmEw{44eJ47-Nb=m-tLgV%oyJb8T2$;-^^fRnPe<+wP?ux5vA4hPji%~@j+%b6h1!nbAuyDZ`fi?w9we=C%6DpO$0TivB(sE!M0508mQ<1QY-O00;n8bvIJ2bx0p* +3;+P6C;$K(0001RX>c!JX>N37a&BR4FJo+JFK}UUb7gWaaCyyIZExE+68>JG|ABCDki6@t%`WbXu~}T +N?d}yMxt$QWKl~}aeP7k`_1r0CM7z}75CwUBDFXUi>m*Yuo)2eWvZYN?HM~%o>Ry$VsG0K1K7aW8hl_uHDBphibnz*@QnV|+?j<#{ +b<19dFBkFGw^9n3B!!1n#g?ne(~+#El`d(oHzh78d)X|A(o&0SAsRdk3K6tYN%4=qhwm||Hhi`7a_M)!``_UeDSWWLG7%LhUd%Y&j>tVE3Zh0%Q=%T8W1MAW%62pWo=+Sn2% +e4p9WFyj+)Mu2{2LkngBmEBNobn;m}gd*O3p$#z0jz?%{AISKcO{Z7J=yFEWcTCC=}c~90pu&NefVT1o=xZNc&#^P(3&eMpadywIq0-h{NF5}U +%tE|r{ssjVlYRL`@9&WF_uFpGAr29x^D^E2Q@1vKl?Hi8z`ukEy3ZUOfPkdBDH*dlLgt{Qn}jd^Njp- +|L}8W1{CYg;Zqi}U{vnEe6svd6IAFa%%|W8pudKLKE=w1CATG^ZB4dJQ`k!to<)3?xNz&HFA0J0)i5N +GLzuGRV*y?O;R`;^7lak-CCRhX6|#4FY7dyrCj{N8mVQ?!Z^uw-e>el|?@ofwoIE&A1gp5b3J<~kd5h +9;jRIGJ=={Qhb{zz>d^#CyX`ZBqM}I20VeW)l!&;oB=HzE`mZHR4$R0XB^V*-MkEiJkQ{^pfda(Zy9W +Ur}KiR*qaRc9g6YByp2ztr!<2cn7R%5v%RWGH1&J4PF#P3;h_>0oA4XcXYdHLW&Ge43){-%R*)c$7Dx8qDi8w6zO;w?|!&8Ei72Pvi!BC1e# +a=_D4siL*(==q+NErXdIrq-Y308W}DiT7ak`i3Fn~6{8_g1sPA8ooxn^5No!Sx7pa{@oDHaYfxaXF%- +77%HlZ;@X=$--W+%ttvs=)tQOS}M>lv{%r2ZZ-X0*sxOr`+V+x@Z&LiD7NU_U7%h~*CyRI4|kI3PV|> +-Njj%-qgRShyWXvtY;mduAgsTV7Gv3pWsQ3}#~IVXm~p5F1VOLL6y6V4VTW3)MATTT8r}1c=#}c4lMy +Kr%wUpSv0Wc)NbXRj|9OE5n|J_%<1QG=X5iF28Lcp2EK#_lIL*1g;$q5TJn +wBkZmNFTu0`quT|ct`f5p@Es}+K)?>jfL^6!m4;aF3NXVL;wdZu{JyUmC0qqTu!10_Pe!4dU`VKoJKHY3x&V`=5wXs{;~$b@U8^a$s;#nV`yFpJIv!)Vg+>;$<`VZ-M_vaW$FlTYX41H=}|f;xwhBvc$I +hf%~vg3!?q<#YHJr4YtL1kJv>T1(M)&Z~HR_h=Oip83u!21OCO!LPU+J28~3`7LBWU&|H|I5WF=XP|W +*?|!V{#K)`%XRD$UQ3_7XaCLz>k9n06sTuI^|I$eT&ZhSVIXRMOMkT~RBcqWter4X4vG#*WK9XT_shZ +wJQDNhveco93dpo44EWYBQu5^! +Y=I*^_F+svDPGES&LiRge@*1Yp50LGNMy +*&9-XdwkNT6OxRK=D}~Mlfvs;HIRbT23t5|7;CF+3g5nc_tmHMbn`0W8ts8Mo8?cT+tAN~>V8+W?lww +ZEM*&b6vzv<-ur*++ny*%{F@R3%*P(e;ham$i<_6~QLm;tJUWPef_+7#EBvYR7xGrSbDMVel4(CLKv^c7Yny +zSW-1UNdzk4$hL$U5vl0~W~Hd?F1ubE=Vqd?LkOx^Gv$r*v?^d2B!b;tW6&qY!6pYPH~-%V9@ic1)VU +R~f^(v6-ZpOq^zK*z!vwH%&q5#gG_AdG&Kpo>*8hWDwJ7chJog5je*M-XV1a@eW2^9x2Ehfy0omwQc} +;cC5mF#0C~LXnuI?3W734VM1A=AgMa1_;Z +M+CXTu)BT-%;>5`#N&>D4!fy|{DDoRID#R$vdkFn=Yb&NgwuLaX-c*ssqGpHOZip6K_zp;T-xC)#3*nUi +Pi_Wc1K%16usbHEhe|3kJvLd_`BB>E!}AD`_0!B^oF_vf{X?`W7X=0Qw`0&T?~^bu0vYj~$@9D20 +}dUyy1soYX*_zfd_re3rH=siLQ1^L3r54-g2 +oOiFX?2rgZOC@mFF4XH^AC*THSysR&!rJ}cYORqqG!{^5Ktz9_xG-&AGg%$3VZW5PHJvpQ3xszV9h +sAI-wK?OtF|k<~gZ_@7Z$+)!0tRo4AkULbL5TOHo0CULbZl#ajM`oE3itIJcpF285YYs+gjH(;^z&(hV)`p5)0vQC$YQe*b`_#uS +DChV4%6ehYf!86hxGlx(B!W~x6kKu6a&a|guOiy43RhZumitSr0q+I^MQ*;E)kq5Oq=6J`}yAxL65n2 +qLVZPBe!OHqdvB&i8-08AOjn0EZeH}q_=1KO#UYedsQf1qYg*2QtDpK?t$RLmlnHD{{c`-0|XQR000O +8RdqK~v(HB31`7ZHdm{h +($|6#!(h?FX{lOSjtz=w03v^CoLa&?L#@EO92TuB>KTpo96SuOhC@0ooemwI#EyGs=$63N-wnP=XYk& +8;zhDjr8qg0^}52U-JSNJ`x)q-g`D|x~E{mb)j&o4fVST3f#Da=@wW<2L*UWj_+Ne>VF%1T!0_*Rs;s +?(}gvs!4KPIw)7z2R8%jVuaT&dy|=6++uv=Vexlg(wX#aJ`S2u4Gw?mf@wl>hganOaob +gcZM>U%dUtFPD4h3pJZTzOY~>Navh{Gg6g%7A~aD!m6pN7u<}s{8j8(VOCYN(~lqDe;l8E_wMZb@lQW +rT%2EgOM1!amItp74;Vg{ai7U)xf-#zGBYFggVcsNn0gh{N4SPXnJQGx7yR(x5&J*=6P01_>=%IaB89El3A<3GAbAfD;A +?EGMIkaX4yGSx1=o5|)dFJGA|J6SFNz7zZib%KBZ5M_W&`U}_-DwT{f$|NqQ|1lloj=aY|4$PJ7(!r7 +GlJbK$DEDG(!@`u|A)&rC_-#pBQ#iswG>_;Z!Y8f`btghHqJpa6^<>@uVo&r$!qF*_(xE1*OH(fS=IB +Q8$$}L{myI6oepav>-0*^z!WdoFR%*w;B#ns%~qqJbh|mn!0Rp>4ZO11!2kXfJ{qVE2XuZK;CT5Yo5U +^H7U5{Ft|~6^QAO%M;l-Y{5oNx)hFz#6J-No0(ViF)fgZZfHz5oqy6L?gx4EeesRJIIQd}P@@met&|q ++NJ&f%5pkjhIp|azrd9(n2#O4SaJcCF+4rCm$F38+jJXj!(@vLs*6z>cDfPk}h2;3;G9on5<}vYg9o4wE2g=HLoyaaY0fK +$?q!ukbBU;WF$cT@WJ}fpINoGs*?LY*{sBjTN+V(@B`7l4vCU@q)GXc?KvT_o_`7_yqT{VDq9DJYThF +P)$SD5qF%f)5xdYPg@qzLr60o56GEE>?yBjsKZa6-Yn_YFbc)C98w=}g%G-Sjlq>|5$M|1M^|;bjFEH +~mxLQ3qX3Geo^Z{KBrO3Gvd;#GM{I6PrC%Q%%@7;SgqpFVYK1T`A#=mW +XwmQ>aaf8NRn_k8EOh>7VG~CT~*~dLp +KTJ@Pgnv-QN6!X1{_L_V0vTR@cvFk8KSWr6n=VmtOSLLE&MI=!9n#zNndkp_Km;`ZheqLc<55DhZJ*D +=aXl_T9g$crnmjJdxl8u4zSK1tf3-*$C->1H~WcZjOw@c=H9fnu0He(ZHcyE&!~&rz`GZnrMnb!|BA4 +3dBSe0+TT{F_%Vzoxdnz523u^(yIM@z&SN_ueX@+xu(<@v~L1p0_NZDxV1p8?b!J2K^+sb|?Y6f5BdK +BtyFHF>1HdrcH}~hpR(Ov+BSM?TN_m@iEILJPLzBcjjSNrzGLs&SJf1`?0RX!$f$*PH&aW*{`C;a3^o +2ZE@YnMVfA@HvD$RPEOcydb}quMam`MlI&IaIXh}u6aLAOP9C5;0?J@K#w7a?y@NVf_Q&*?CLm?Mg+* +hN|Gq`ab>(|4D4iYpXp?4NTBr8#j&iItYejq|1+ws6|K=n1=H>A#cYu;9OplpCmbM)PYNl9MXlrD?U! +DE)^k`b}8}Ze%Ni&-WUbi9o^_EToQ-K*E-wy7E)>BLMZy-s6?9A(3cKQV#j-l``NJ`YL`Q0&Q)(cw%s +S~vQVmMBsdWK0;9HHzj{jkYSFD}m+&G$NHXh$o1;uB8fQg*5Q(L+2$6Th)%1yg;)3ynHl#=N{>Ywe|U +(>5y++ID)LsZiKSPMlFI3(XqBs5oTln*}npaFUwL5{eP)oBL)4 ++J!WMMg+bU|>6;pu~dh%a9ZT7o_0y9>|O6|Hl*!-sHc#AzPG&n)V7G4V^yQ3K-M(XpdpFGi#%)sU&lC +pz5?hshp5?!4AU@H#`D=Y52F`g=J5L%|o59Qm+&L{L|lFm{RhCpDiIO}}aWYZSL)?A5y!H0r34c-H$= +YOdqzFxqlxIqFNX`Pth1c1^l>RXT^$CRdGdx4YhPYx5qr_FcO-)U3O7?U%jPbtOZc^cr(FZg10j2Ojs +Ti%&Qx4i$2JcnNId5o!Bo-4t~nuZN2K2Uu>r;`}c#+2D1rK4HN7AK8TUM#lSg56u0W+5b}zjKZ7Wd!y +k2?%r#1sV^Mc;q`&-xI3@Y_I;G={u0NhPKMhGj(-RV+jsJ5wt}r)xpDJzlo)+WZu{1lLGLu?Pn;8UX` +?qdKDL+9aRO}?h$4{U^Ns+yrSVtmeBjf>=E)QHhU%)1jNg6DIcO9H!a+28^@P!6jmV0#eW4d+`#Se9x +_R9@5VpG5RGf|~ovNNlWc12jrf$L1lc;7#? +$|d-C*_QvGaUT;w$)UIPmK?O3&EdiC-FyFaB7EPXpQV?({*B>;crEzdiG4-Cqah|g;dkK-nGQ+mk|zG +mx0S68ui`zfuby9{-=(N@E4IJt+_m`ldO$MbZ{YDCP)h>@6aWAK2mn=eH&RrPUyHO50034%001BW003 +}la4%nJZggdGZeeUMV{Bxwv3!ryB#favZ9iat +e{ddd_fzMvzoz+sw9`Ze#@lfRhc|~^!U;Bwr|NxXv`(qRe4)5LIuM|lt@-nK^taY$V&B=>E0wMtLE{e +lChkZ8wM-OvsD2QPCbNJeYA;stLG(55_TNL!XHgP~Btiv!`ix)KdCe*DNM+|g{yOC}B +k=SGWy@J5nbm`^2GZl=b{j59eWtjSaze>}gy9qg0|^Ps?iDX@&g{b@gtcD4bgfs=PCW-uh?%b7i`DM=2E|j4_~m~KxUE$#T56LmO*}7ceBy0BA8A9k^=G3+Cto0NCLlmo== +_I<49!2Ll1X-LmYaZdnvUcUKW*@AWC#iT))VVORB=m|goSFC9Th8+dGC)Jv$ehBuX5z{(>Bl!4W{|t;SW{-q7 +?$er%fZKhImdUWu@mcnUjCeLNa$2_yb1Qw=4Idj*_NM6ALJmD6U27*UeijshaLEMHb(h~^X+>tc^UZb%`3IYZGXT$e(3*iE9>^7y%Qr{{C0o^#Uh9f +MFq-5tSA?~&hwBl!^Aj-txU38!FIxkclx?Y_{pl5if_EY +b8B94a#8DN{2}l6y3Q3!waHL98HA+&;4Pt*{az&zYMK>(&UB*@cD8=;B%Pb!jSol`aix|$U_;76an4=3Q +Sf03RqNZFydjWB&uE&}11pM)q-g0yyhQ7jOR-$lbIT*$h@|xZ-2Ko^q0B~VL^N?%ic#4u>jC3x>ngnM=(P)V#13b2+C>RVBRkWljUmhu9}k_;5aMrT +3n;E%>mI_~Md2>q4`EkLQKU(G{%=D1tuQfY$eJP<{^^f8q-*s~bbs{6ym#pUzwUR|Wu7q2hRUtXox?= +COiV(Ox~dUcTGyPsaZI!`a&{5+4ny|{dF@jCtG#l^*|^z8ZBi;HNhtBZf8iVwW~pa+4Pg)>UCg3+?Ar +&t}eO4KP3gp^8q;J?$&a|kyfU#LW9C}4>o+2$FD8y7c6%~vtHT5^V2JQapPZZdaRl~@+sxrx-yK$z@) +YA>RiK3WurC_fIn!CH5GAqFtlj1sAGn*w~nw6STUYp3=CQ#%pHv{Y>3#>uIvbVl1ov?^J~aNp0NF`yl +&z0!?PTJh-I(R@&9werDikH|mTk7romK58RWaBDB$Z;E)RrE)3mrm1V6Ud(3 +(|*Iesj4Cb{TYiP-vke@Ov9W)PG)hSxq1^Wo|L>#ZHB4;82m#ZCFh7J>gfxHU2q1^Wr!b4C4nq}Z0%0 +{Jgu-M=+An!{)Tj-vUDHvS44o2bzjBczj#M^WbKJ*d7pd>XXPjSiM@9E7x3TRa$wHD)!I+e@Ig^-$Ww +#!q%iA-p&F3{TdTQD7Tr?ZaqTZy@L78b5@8@Q#ylpfPtDmbjo^qye@h}(15T_^~V(UxahVi^;;ty%!l +N`Vek83QV{1&27?@LND+ym+-HlY(t%c34V9uDl +?`XXNP9oCElSr$gzml$3u#R4v2F6r>guh@M$qh&!f3W@HHEH08}RTP<>AahisOix&-Q0(0?7$J?`p2m +nUl~n+52qJaLsb)Yw6}xMvcn8tbi$WKTs29w?HllfG8m*ixGk)Y*< +b)`!5UeyXu8}xhb5LT1`f}P55lTk*>J%g`hg71{?BSsE5P9q5b68N3Xc9h9t0V=aFgv(C6s{YBlngrl +BKPX_1@qt7;Z`D3>5^3T_AP~?UTVfUQ4Hod83;)Th+fN+QJFG6V^%~5l4sp=a^clLg`yG-;raN#75tR +=H(<$OIqL)EtB}JxMT0xlmpp|Fg+?#o&vA6fsZr?1%mG5q+lpBq%_^e +ha4wu>x}@1f@e!0RM;GrlcrioP(QgoEUL0NOy-gJ#7e1V^;duSW?bGwfn)EEsOv*lTtOcc=QLoVPH14 +-JSPwo*{$cJLDTS{0{+ILB@_IAa)_j~&pE>be#V?i3vBT5b3R^6WfcKY*3Q@mDV{Hhm>IJ+{iSa_?B$ +;kXkqFOj;iVp*5HW@<7fIBIFO32usl!_miF?0oA*-PO%Y`qG~X+MNTay7K>_ +Gj(-vNQ0*Hpg5W{#=9VTt`}lXkUg8A~g4Rgi6BNHoB)odp#Jw8|Tm)=J3HdO=ywhk7E)J%yMualS*if +!v_(X(1Zr}0fn0$-2q!2csh`^gm-~8ARGhgT_8OM(EEY&p}@R9C_fL74+Z1r0P$fUd?*0#4?eG`j;90 +ML#YljR8i8Y9H@e#`?IdSJ9&02fEcxGoUu(Gg-WglCMEk9U$|eP|l|ZxbF{LyG>WGtvytC68pvwxfvQ!(ZR0iL +`yAVaK+N?;{3_Yjei%*r1VE+EgjcbCB0P&T)@Sr*Akilm~@*_NT2>TSKS?lsfu9S`=|+)nmmRVeDt>l +@)Le&Ela>4vN&r#Dl<%2n3}-bj1JQX*&_FC5cA5aSx)woFPnhtKH#Q{Wa`M$Vqsn{%xg#>aJqLJC3i&sHLG-o5&D0yHxE)iLvuG)KhH!xAurdEbRJw +9RbNHW^ud9y-Rg&3KIx@^zyte8pozj`Y7go-s_u>}T)+`bFAZkBzOdXqMT_d5&FSoi`|yq))d{*2MCH +k;-f+e1KY~cIKPrIeM9X{=>V=XzZa#Y-o{d$q-&HNywX#vQ5kebMFp5Y1OXe*Dget$Q@r+jVr=aqn@d +xC`Fz=q=7KkDGT@Cb)$=_!uiQcLh84v!RKFxWi>J+frig0;CPW;2T{p@G6@Yr``%iw<{6UmsC!XR-Rf|IL>v7036}v5?Nv6_q?wQTtRIu4o|Zg~xXt!NVO|MigUri;2(`oc$;d87cd^C +3&$;{$4Tq8^i6mT4(ss+cFDr*AdxTMsRFi7`;U5;{`b5|rX(;pq-Y(r|0S9Cf$lQ;ZEj%WAPlMY>4BCvaWAg*M +15={s-g=I{KxYcPYiHiAcCQ>bjm64Y_N%kqf1x3q~hSV>!1Ef1(cX!^D~Fm{x?ud0|XQR000O8RdqK~S5Hou+6Djs?iBz49RL6TaA|NaUukZ1WpZv|Y%gPMX)kkdX>M+ +1a&sA +6WQAFMyKOXP9J4&XRv7W_7d-01`a(;Ruiy`TS^~NZ-9Z_bvlzO>+cbj_7%T%16oSrPKNm(YdXm%%bVr +-OIv$VoFRtmnDd~-Q__U85V)$1X%PuN+MnLx} +jP++T%~LU(4M^_vBvu@LyM{3>?1X?Wcr41560u+oQ++4YVo(m!&jVUtoU{Ibjh?cp(W0KSTsnadb-CNSj`Q~ZOI5oI+v2g8ccR>Azq{c`_j!LLpzo&m +B1^=(&r>(Z`>Be#lRVgsUI%{0T7WZJ`YJdz?qRi)Q8S5Gv(=wSZiNEi>tY=6M@rn7SZ-M$RWD_g%}S0 +6n@>mUg9NO7w@wYrMWH-ug$jJ=k4=LP#Vq@ti9ss_?2MigVh;0m(MmL}8>~AL3wFlVC?{3!Q$C_1MEM +zY+P5Ixc(!xhRTQZwKgFCVmA3kDCOT71oO&yLad#uCW`Yjqf<4Y2ngx@MFC~T3h33jTdY#7RKVSVRIh +ex{Sw^N4#NvMU%)D8UsT{=t3f{&5^KhBx~-34e*1OQ3<2WK4ctGjS=0l&6iy2+73mN~@Ymdn&BUzZV +BH`jrUHuU}`%EI$X8F=T^7m>%i%t;mM{yc#nSRh2SEMgYS3QHu%R={e8FCgxFg07}4M9UG5$`$VLMC! +RDfXe||FsZ!c2El)M$#0l$-O^lSnKBVl-sF$H3 +c%wmM}p54633_dKG6(nv1^%0^TiS~WIc@HlSTO+O>p6wdK27DKy%JJ*UxRT!d?BM1PuONrdtolO!_Qh0?gggu^c7pI*Fw`)$a?(fe>~pHo^Jpx>|Rt9n%an{o|) +<8n#MnoQ_W?J1X+)UN>S#C~-z{jr<$f2tH31%j1U+0vleCDMx6qtc;gt1lY3_MykLRC&;73TiPehO2Z +204uyNSD`npZs|p-8?t#$Umd6-mSqnwRJIh#sA7}p^Q&QHMn)pS^ckwI28KksOz{l}0{*VW8JcKRzFL +o=pw5M-v{PA_cItg=bH`9RL%4A9;%dz|Zi`4mLdONyD;*rrLN0R~%5k|gWtgqMBI!7q3q%7Cm(GyIah +bckE{vM$+TWEN@Y3K$AtYm`g*euSi!;Qb*Z +#Ugo95S=lM_bhd +T<(1!N!#wBHg<=i<%fbcO(|b&srdtf^9J3XS-Wi`%MuFTP;v9D_%H`4EGNcpg>+Y}$iALlPY|4ma9c( +p&NRD|9K*_3p7MxY8<^8)zL>))*AZNPf@`=VoMdGT9de<$=4gR@wd^}!4Ag4n~$Jr+1<4k5_>0B<{_| +wlmeo~!u*|vlW#+IU3_6S3t9wKPNGo27>+;1A6MH|uAW>&{oVIf>M_I&>-?KZx!!tS3?O9KQH000080 +9AE2QlMN6U0?tJ0D1rb03iSX0B~t=FJEbHbY*gGVQepBY-ulZbYXOLb6;a`WMy+MaCtq;Jr08~42I#| +lJCF~%FoI`6C)z1UD*fA^-pYaA|NaUukZ1WpZ +v|Y%gPPZEaz0WOFZHUukY>bYEXCaCx0qQE%fm41O<={~+WZoD``y>}5cK4(QT#S8Uf7yWNIEQ3Q%j$3 +hj!ljP>IUq4c^61%5%^Za626vROEPVKU|9Q21 +|I_l9)o-6}Z*OjY_6Vwk;Cynz@bQL+MlRKU!R{J@#wF<=)(rs^QsirHVbyIp>Mz45X--bMj~i8KcG26 +^EbB?K1an9;0_H6k+n)Q-E@(aaU-BE8GnjzQ!o(3g-mopvKx| +1~-j+ay2L85wz7b<9uumx!Y-#IgAdI8u#P(-C7dd?=e@3eV2caKn4N83hJGa*+VGJStb;wQA#YMUQx} +0l%6b|%>1aA-GpJMpDlXIod~z-553K!bUt511e5})c{v(FPcggd#wid{_9lu}{ohFRHM39gBL(Cjd=p +7!0RD#2Fb-qdj?l(Jv(odQPl30Nurw${7R{y +U}YBfeAqY2F`x+BG(B#@9L-s1%~2hT>^7q^OlGX^;Z-2OjonpUPIvpXmp>#Xc#hk(AJYDnS+E6@*$6-fn*ACJL6Lrl(P5ueie-;k-f;gNZaF_v3Eq5;k?g89;`D1IFEt+BH3bv0p +wPZBhLb-Jw1KeakH`Wj)g~?GjHhh6e;+eo&9j6(*6L_eS!u{Z_=|cYOAX7ER4w2kn0^t?M4s-CfE53Q +~$=gk#P+e*aJx)`?|Q|aJ9+9XcZ*0p7D85>1?e6z6-VihYa3yEBgqB3P%`0)raw7fb^n!_ktVmE(W=> +QPILNHRye1#a2jeVt#_dIAz#E$<9m;X#}zrVhIfBm)g&T?d8c78_S(Smuc>P$%L#Qczz4V66tf0eJQ{e*nWq(b +56XBZlAOJzOqG*07$!<+)Np +h5tpiCsbYZf+Oa^}XSq+nu3?$&%q)S4O&90RFb>=Q@DswKB%_*HB&3<${Nv1osnDpNq7Z+f^2}n@mqHvaMq1jb&OeA5(YUe56KO~)6)`-gy@|eBRW8uh7@SA@uN +Y3_VI7T74hM!*pumFn?G#5Y!0-L&Eg>@o~s&97h|edO@8InyCew +H18p7l_@j>b&-)MH3baJAO1fS4Z5l;MxEJx~js1s#43HYJrA-W_T=LX%grd0DlyCxXS=4;M!D(6wCr^ +5*et?$BkK)R-7JrC|^iMtFl2=cv#lsC(gY{RS7jA$_=va7~AV~oIFxZ?x&XfzQCtKh$~{z+GYH+A%O; +(IXeM@2N1j>d%8*g)*XN{$A{fRq8E2Y{qU9W8*zj&==*P*NcwKc9W;14zzbW;6k~O7-?hVQ}E305kTG +5J!iU7&J$z187NcpAKnF-a2aY_8Ps;V@IxE40Vt0r5^-9{E92*#H6)u=F2t6olrbuq5$yKqND>;jT|T +_@cFzaST>bTX(CybJD_C}_P@*)B`uO5_Spqhji}54+1L6L@^=c`c*6h}%`Q2x2(v*aA$&f(ebi$BwJy +-F*>`9{a7_WJ!9=qdiQdSVC{AiBa2F)Q-KBXZBuIYd4Du9?LRv&_>3F!oPBhxCJ$EMg4$;TIF%J*mby +n9Ds)aQbbmEN1&1Hyc_h8G2x6O-DG04mMjnZjC1XbDC2%n{=&Io$4|fD>`cM +IDwI>=*>B6k^yBWfR0>Qs?_AV=*wa`-|qYU?rA9VG=VAkdLlpW$<3%RYz={QyPa$|1K~Vn&`vYxv>b+cJO=K$sNH~059#xcO;r{RF-N9~TjmZJ_D=dxNIMCGVnh7wq8Vnd79RH{b~evNGy2XPy5-h +5Nq&tex-lvyD4zj@PO^80W|x<9ZbIhvz9mZG;&8(ug@TJkZziW!RlJL1uFPRHBqFOj$c)K$Y>jf +mbDA&fpim8LpT;p9Yn~UBSFN%$biXcrJ|E7yyj|+HI+`LA_+$e7Qa-H&;y~rAA0curQ4eTtj5OHHFp+ +s!exRU&{s@IA34Us+D8ux95H9a5l*XPqU*#WT83n5;qHY*&l>9DzNMZ=E^YB&Da_;9zpJB^Fy$4&cG) +;S7FHMg|50E+X0V1X>>T}voN?IX{U1P=Yq?I4c2iQwYElcnWd+suN*Z~5nI|At*FW@K@m*E!$&#vkt& +d16NUKQjrjRXJ-U8){ZK>Zox_)u4F?3*#k@cCU)kvv3;+xU@8F9`vdKz>`ym4pez%eIeCcsBiK_B?bv +E6UevY?A*6@})qupn<_I3Xh(UK0O9`@ke=F*7`vP-d%oncTa7_>=ZAwy8XFxzeTD1LVS^XWQ|PQ#K3i +>0UDqa7&v7p9i`)=+{7T&?>g#Jza*0=xOwdCR&LWNeA5xtn$0sDyx70EJC%6Moyw>=MI&(dwbwYSCgF +L%MmlQ(BHJ9Ywr51+`|E9PUCj7nNw1 +~M4J(V6_;1tadau@cHd`?GUzeG}wO*3ly6g$;%l@h;7>dlwa*y{r)if*Xbp|Cj6@YJB?HqUK)7JrZ0_ +_W`(5MoQ`vNbt8tBf1%sHG)Bue86^od!e@00fR8t;?zJs;g-&y(kk=u2AACH_9~)EW7d9MS%3gk4ZAQ +~jS(Jm*cx`=wUiLG_M?AYB8tt~@dZ>SR_i5=}u_ByS|>#-twybJn08up%Bm<|5nbnLw}`$b=o$=Kb8j +v^mqs)2A4NCtsSf7_DW1rxf;oOeH6)UvMg`P&qRWt?<{gCJ~M&TW1PN*FVK{>N~BcMs3j4m(;0k7ql_ +!IRg#=UY2|Z`LF=ktoEk%#j5>SG;RLRG;GM(#l>#7OH58DT&yk%y1l4rE%D#kd>P)h>@6aWAK2mn=eH&V4v{H0w2006)S0018V003}la4%nJZg +gdGZeeUMV{dJ3VQyq|FJowBV{0yOd979NYuhjo{T|5waAXv0@XS6JIw&S=V_h~d|p3qqA8m*sRaofKMCQ1d!YxwNPy6LBVZykQ2@OjQ+=Iq(jZbU)w3 +7|U#92$iE5F!SZ|=Q4u(ha{Qb-;Y97jhb1mq=~aFX1f6zOea9AJxgnr?O2JaK^yhw8kt4^B6Z}%OFD$ +WoZ`aKgpK9G#1%K$km^NqqEd~m8~YE4-Ph#W0Q&Lt>nTmX&Xe!y@?o*~w)o=wbk?GVo5AC_M0?ks1!* +c-g=rePI9`kpTz93l0#t2lrVS419+_y+cmbzsZsk6LJ8rBapH4EtjDf^?*S9U`zr#MsY&LsD&5J!89E +09W16%ftK<%%oF&lx9V~sLLnQ=5RAzcbb(ijS-V%sBV*Hx`m2`iHCTDtavb1XnNGB7BL2>O5sm@dsA% +B>HsGQ5VMtGKIbMfI&i`1qOB+JVq5e=xuqMxLZ3VPig9@ompuH!!D6zEbMda?HsoPy8Nx#f>|@cO!)h${p1(fFs~8r?pEmo3k +>zzs-ckAo7=qHzjeMKqKdd6HM3)+5l1HhL|2XDfTDZg-GN4xA-@M|-#IU~z@gwk~fP3wzack6jz~zYY +^)^hP-s?4}n{KSMx{__Oc&;6G4jWoxvJmfaivc!R>=S>TB`vxS0vgA1CMgrnmWrU%-Vo`fJlVXUE_W%7H>JVn>*cjK{d+e3EiS9Vs?4Hn1c(0!JyxJqYerO@jw_m0+N<8B54u>62j#{1e~Vw_^ +cLDlxm=UuLAeh)7AO%a*a+7`N0g#$%8S;eL}H31obK~)2c*=L-nqf!d}gm7uT){LsNfxUl*$nYj-d_9 +IDTow|B?m0B&!a=B=gmr^>(`R_{NuTAnYxv#ZNR$>Pi%!*C3Lynh#x$9HkY7+6q?;drdxizo@$34|o_ +GbX|Q*k%9@s(=bJq-s=*q?ru?1;X^wx`4;3Q>^FqYHwGW#4M#fLXL6Mq`zK3+l)xHhC +$Uot$ia`Jmup>C;$%O~JNX@X~@|<=aAj+dx*g^AoCJ+)|WWwH1*vDiIX4Z}N!cRda}Gsp0GHP|rku1t +K2?W(Skj0Bf!zEl1T|`n`bpLa0VwB(P}dX7RKp-)+tS8&yg;ls^HPz&(LXkPxDz+OCShDSDU!pqn`1# +N*_@jNE_p^u4ZOkNhoOh97;S|q2#ZShYQ0fCm`uR5zJ?;Xx3|D*%zVgUmwc;S4Og +bZ6LZks7RvMN0MXws!%kVRhH)WX!MN09qbc?%OV_a!;>sEe;+jiw(51wvsl;j2#V?+fzLOhS>9!R=d; +I14;eSuAntU*WVd_s5YCt+?<}|^10&OPu?zSRx +K%qSEnayR_#cg*GZa}4P|9kB+DXC78$4MvfAykazzy4nS30?;Z4@G9I#fDYn=1j+w0qy+})p@o!{O0Q +LA#DZ(5c$c~$m%882h9p-pPRrR%()JSJcAa>c!5>DMK#5wttYOqkWE3*v+(#xzMXos7kTEI{1M2SB7UAs{B$|w5Wm=wU~L@-O5EhX8q$sedqfrJ%PVg +d-XE5d8K%-1QWu7&3MIQ5JOHfD}oFn+10 +>_1^z|qTXDFE*A>y;E&bkS}M{twU1g=7UK4&dv&1UfC)Jwt?@mgL2nlvPPdwI<_n%PEWDTj>J{jK>`8 +on(xX8V*EPG0Dh7&YBjD3n|bN9;u!+pMl>3A6-qQ;9D;xZG~Bm$ZQ6tSy?vFg^J*-;@=jDWm^ubNGIMlE7KUF`2MQEZLhd;@*B=*m_a80^z@2}*_h!Anm>Y>Nr0t3zI%O%1&vA1M@uJ17&B@$_pdN}WsR!VRR6_gakIw?yGL!<{y>-+I0iTvoK+|`UFpL +K_xA|6^OX_=EtNkF6~mylnXt`R+Fz`#D^|umj|Sx_+pn(Yf-05JW2&c#67DN?@`hXjvruG~^wAc%8#* +m@OzjrL5lGIf0t@M>l1idqq#%DNGduZCyI)o$8{RlUgfOx>kdhJBiS3yzS)p{L4E9oPqq~->9BVT^Y6 +2Q)CXwc$6%1$ZC-c8iN$P#q{rADzHB2XP_r`cMd@ri15RqH=u`_H;=RF3}*5xPYe)fg#3B(No-?3_+K +*o+0gkq?W+~1wwc1KFO`oN7L3i{LK^*=vc_V7m4G=On;@%g-m?^3i09brrr$FyRO3bZD3j@A@JFUHBC +=PTvdWw#XbN160hK?}WJTS64$XpB%WLpUR%+Y`mDjY|vIIxF|SNW&BCX%gAKg@R#~a|GXq7^o>14D~f +I4GN=KFWI>hnT7?>%X@+@Fu +4P>aFuV)=EC4DpT1?VQBTxjTNh;Cm1m4Y(?QO$o1fvHbHV?6!!;z+Q(uNbI$}8l>Xyh{eghw$c2)Vkx +sC0Udzj`O(_|(?o?!l`<7t(fOuKCL*2S|2YKM%_V!p4F|3)>-@ydXrJ-o_8`c?coHV^Ck@5*iv1Y*)C +cR=pPQtNe=GaTr#3X%vEvTMrv?ogJ<)*Nj}VzOyDj0v)DWYE8*(0u}HOtTl6tXwoQI93l`8*a=%1wLj +@$Z~r*WQ_In(WK(CRWr(w8(FOFItr`G4q9TIQvyx7{kvi1KFtV2f@GYeYDnOkKxA8bQe$*kr)7GP#i<|Tb$R{ndi7bqsJ@aFK +WuvJ06kyM#zH2s6_Zf$i2(_24kFDZPgsH*uMtEFP2?}OtM~{~Qj*COM)wW$r2WM4VtVDyf>W5i%%_=a +*O!qZ`b+E%myT3+HmRq{~k}k8N2xn@*C(q;QwGFg0K%lD|`83#oA8iEi6R6vVyN)tO*6unGe-pfuCr{ +78A$Ec_f7U>2FMAS%Je=wnjk}SRrM1Z149&={E^uz)HJHv&Vgi3-9JLCQ`B3gHXa1EIH5E50yX*@EX) +$Vz!Zww>S7G^P3;k`oTL3hMN49Cv!?{JxvJh;{gh7*kOiAfTdB-x4=?6B0Z<>(T@C5xF-xS{>?t9`Ld)j5_JMV;9>rfQQH(6C7ziyJ4n&?`e1qP|FBBh32$)wVhh;e8?Wdet-w6?&E|>%E=vHFxKLY3#kF$C@2Ot<8`sca+w~>K4m|pfd;(dv^r8}*?AGs- +L2I^u|{0Bv|#Vc+cr9erW1P2~>M9;y6`riyWKr|wiGg +FwgO*}VUZ08Mxt$AWYI@bNsS=?{bu+gk&>Ow`a?pKGsAh~GecTzcTySB$ci=m?HdukuGgYn_ur-N +hk6g={@YIMO8UUtTB^5iR!VN;84`%@*Hm#WJ5_N#B`Yhgj97_4{lb*oLRW#oDh8f=;7T8JoZ~Y4U9{1!zkmCkE`L5-{*!*czPR}1;v +Y5#RtFYN-o7F5v4X)pJEk-bV*bsV4l|%9fL#Xjf0cFD@GF=~DIz^iMP=sXTxj_FoAo_wP?Mf~9ONOvUlgNxt<%%pq)|cR=b32z)+OjQVT!D0N-_(3X^hQ3?2Q(zdwK=il!khihnsh>PZPcLR4Sc&T +$cNA5Lbl#Iw`(cdmCUpE`h>jK*_^~8M|;A-qhLbAw-9ryd_LLrr9FVZO!-f;!qKJE)@E?Wl%d2G$MPu +5Cd$8F75qdl%8&!>IVP=! +23kzzj3WnPyop7Ur0yJT**2&reCA$PpZN17A}RjbG~@5r|f;DNM|kNyx6z2lWw?J><8(Q;kJL9 +q9Yd3N}F=h&EZ35UJXVf@r|`&lZae7jWt}xZ@qUQmoa$xP>(%$!u$n_6*|}tga!BUOmN4r`$~Lv~ya4 +Y*Z`J!0ufPNg>v)bk)M85+a=2jUpg~v5j^#K6GAfdW}Koou9EMlT@rFcbs&)9ak08R-+*;tfE>19e7E +@aVfol(Z&#g=o4??2l2D1rR`HjLM_!=CR&I8f$;xd{)IVe^ +s~>gpPv+?s;u01q^a|z344)G;;uxUOfs4jquzf2Sl!wCNL*Jai#VI&dv%zwigcRR`a{Ats7nkMG@TxJ +`5?u9@Iz^5~Ao+F6?jVmL*KH~89p&@e%bAl-Ljq@i94JxICyVjeRaU|K15{)w_r&h8dn5NXVBU!SZ& +QXpH+T8l#ny1Z46rVUv0dq;uM4Z-!z10|EBn&F02w254O{En-}ok`x~t8|VBnyQ*b0Q>PalI-$psPn +fyu40-=!CWb|)lwNpTt#L)&#KpmSn-i#Cp$gd3{aFt}MGMnQ@IFbRXbgpv=U?or3(5N3~O9`ET0=vsi +cg2P?^8Q}>Wld+&U27!D9N5QX>r!m8G(RU+Ty++}18HbuBEKq>e!1Mg{+^2m5`rvdi_Zt+`i~~V&+4Y +VoA=-BmI=P?7CkyVqDDruTUt|ETxk<>~1yt#dr;FBWYkhOlbNj}EH<}+8^c8v}o?Ix7WHFWm;6>oKo= +6cQwipTKY_!7u^%Uk&Z**oCGAdlNz~#s(9%BkuL8ai_QrB(cr7jb#HsDjh^XzfMxgFFHfJU-9^9kt413MH +`YNaCo$Od=ivLn26Igfziqp5@HI8nEWu}5~ETAw+}EOJ(u8n&H!+})4!K$_ktW^*!g4*`zaCri~}W}Z +Sjz4kACx&I$R+IL|ASF!hA+m;X06dyz)LO1Muq3?MKc@HqVCO>(=`P{F#t1Gn8wt2>i^w0x}qriNIWT +Kum*SuL3$tB@%p~cVeI*Iw1)|W&ezGLEqj*gg}x1BtmG5Bjd3tcPO?edRv@)}luP%sCFGKEH|uC;s50 +}Mmwq1O7KZLYGqSHIyQ4La~iYxBrd3%NByui4cGF46tlu6EbxEoZH}u-l;8cRw;4ah^(>y&d8f3bC-v +IwM{5EjyZuZ!RbtJZx|b^%q#i(rUQ!hz2YH`ik2kEjzR8jO7i5TCUt)LE$ar-B?n!VJ&1Cssj>GM^W) +IqKe}YJ;vc%`f$w}JqG8+5iWcO9Jr!yFVOQJyy^`0^`2#zc!3Kvg6v>jV|ZIh#0k$mU3gJjAjhjL3=L +jN$D*cd$E2lx&)lyhC<5Q#0LyqCNq=EAdHi@maX=Y^;No=+U&kDWo`T~VABml1`0GmMYnFRi20$ED$? +2gz;*i<*vwvNmU0z+%x@6aWAK2mn=eH&QHA-0Il{003(g001HY003}la4%nJ +ZggdGZeeUMV{dJ3VQyq|FJy0bZftL1WG--drC95W+c*&azOes;$Wh`z;=B8B9F%%F*!CV=ZzZh*7w)nNS1Bcd2mSsn{_e|&HU!6@S>8+5Fxi)UT&|ic>7uE>#OUljgkeacokD#8c-z@aVj +|RJZX{1%5YigW1R88(g_vp5vXBm3x-yW$z^#|Six7C%A#Op)=9sGuQgXtKxuAU%91>BlhafHE9>g0E^ +U~pHLA;?H|75Q?d_}k`-3ugwmaV_mOg^&M6A_nu%RO#R8bo)bX;(qcG6JlS^>?tT9Q(#f(iaF(2AKHy +-?f$m9?pAb3&bgqOuA)mGAKLOSC36QZ=XKnhL|)N&WNj%}09s=d0Vl>D%{rcYodeVWZ7A2MEuvuL!=J +Vhm-)l!i{t2PSIJ0mJx|*IXN`*X9;Nm~=@NBZ{xxcM+u}D}d64<-5L01=E_mluxCQEb|eL_Jh9gR?TL +!_MsCY6~=>YF~-)O=T@gBugII`&0i$4nIuha<5_0#4fKN4+FBgMl;{dlzTu#B+)019y(g8DUl3+eD=` +pW%an#-)}8J@N!55BTLkrxNyyCDxg8 +Y_qPs^^d6_?W7d8fk0YyhziFU8=*N-JE0=qd?k{Jk9UpXBGe0a|ftpupunVsF#Q|h)tKZ_Vt6U6?jgf +1zFvYJ6Xa&v%I!*T45azTB4zw#wosG^T8_D(PD9)Y>4mK!t0ug%yyu&B}+*&sLnreE99Dq9?1)iUGtK +u=4?q>isn+;O2G!yrP5lZmz;QMCeWPe9L|T<7KH+>>6%@X4s9-REd_Jbb5+zDrzcdu{QT=Br+e8XKB;KthE)!dQaJaM!+R|-e4>&JA +xoLyZ3LTpyHQH#H5Rf6v?^F$;TFAIzYhf1#(B<6VQiH6GTk6pZ^p0$B)%k3fnJx)GFUh*bMI#5YmQNs +bs8DVkA=vQl0WTJ~rFSbC(wVV?xkBWcc;D>KCYu%ypN=G4nnU`C<)H2QjzI9#RiY;^4#5!?5vm^V>(L +>uAn3!Ue~dFs5Ur5|&v1EQi^3No^`wJ#j_L=6_b*m~SSPfxDXO}od;|7nOk3ile7ugNOSWm$TYV>d)M3Vqb~@V+g7(nHb=d`LqzAVK>`enuE{j5JI);hU?jG9jf=Q3n@|^4m +0+j^MXXRMyT;hG4L?$S?`0Yl3e~N0nizmP1b?gNGxV7x|aBIJuVAVmGbPs2^a2mkxEgNTDL(yc +5EVllQ?1lYc_Oz2z(Z&sM3Di7wI-=HKkH1J>Mgw6n3 +Aw3NIsDA_A5cpJ1QY-O00;n8bvIITXA16w1ONam4gdfk0001RX>c!JX>N37a&BR4FJo_QZDDR?b1!Cc +Wo3G0E^v9RS6^@2HV}Ugknccf7$jr1+V!D84QMZE+7<26qG<{gSs>8T$>u_l97!e3ihlPUNzs;NWoxt +PAu)CTe|Nk)u~tcKiMcb!N5@BvmMu|CSsi>paNjTmsV=T +3uL8%%{lsUgRIXOK)pOldbH1%%ejRyD&qEI+Z%5;`-lcQsb+Q@Ef&Dp9{*X!wcf=mrcL*?y7!T1WMV+ +wNiPBF2LBENll_o+Pj_4MR*`TpYU?A6&z2lw;SkLA19FV9IqzNDxmos-mn?Ua?08+WRiv6`(q3+{Bg0 +pRIZC(4=$oy+4Rf{*tJGo`3DTW~&7-hmk~>^t}d4LQBXM-`{WkQW}yK6P3Df7TmFk|g|i+ga5ipaOHq +In+ea>YA=y9tF|xXU8Y#F$b-j>LR5|fv6AV8`^POTwaX`Em +(R(b&)oV!&qtqTouU$7L(mTNQKLmJFGEB<5Z&t;_p8ml6_77NnC^QtXR;3tU>q-jm0Q^J>}%Xh8Yq-! +io@N1=ET;gQd}8Kun=c%UUqG%h`7$-vs0vCh7%e;`#vA0KB7@ll1=z`^Eb=lc+m_yFA31b`ZszGe_`P +wIR2RbB7NGhgewYvyx7LmGtV<&um<%sBvX|C1Ch6a-^CyY4L8PvXgSLZY@qOMG3^ +F>?s{>FLvoYN9)t$EaL?881Erjx|2rfh?B^l7=9(#2z=9s%+&^}>vDU$Vj_C-eGcsA&2n5=aRto|i#-_*vN%TZir|Jx;>K(SD)MB +0s6>O}wDKdpaO=zj%Nk$f+FK+~e$Jmv>0rimP&|A5^x25G7q6Rc=qflDgL|Wx2HQmukr{3rBjr2LibE +Vnynbqx5*zB4*S{LExqiCO<=%{#TwZr3-D$+YjN}gQEl+$=w)pKcKPP^?iiqcRQ?#}J&>Fw3>;(E@`Pgm#Ye!aX}ocW +jeMVe26H1x~^2NcO5K3v#VdPS2VBMAM3FH&{UF!yVtPC)zEMpx +;XrSEmJh=7A(G61)Mr3kA7D~eI%-Pbk^3I0tP{N&wTfu|}F@8^YnJX-$q6*@n1s1$bf_IP8LWvYiGAQ +E%8=ktGlfYO^_%;59H>FL6Z85YdpsbSs^=q}>2IJI0A*TdWcNOsWUqClXSKJmjDYboQgHH +99e0b|KC^oKzWT9St2c*hb5CV)YSwWwuNveav*bw=+Xdv8!y`B(KBSpFm-7Y^FbD+f)fYADctP2g||6 +yEtOPoFh{k=K3W(INq14%V|4)-N&i$F+dmkRtKaWCAHeqkH6c7UbgVIFS<E4y&Wc9~bbaO(Dd?|4>T<1QY +-O00;n8bvIH{Oeu680ssI41pojZ0001RX>c!JX>N37a&BR4FJo_QZDDR?b1!IRY;Z1cd2LfsYui8!eh +=h7h?HRmQnTl>_9cY1Yzt#q2PFh^iDlF0Qq4`ZwouC|QI&<4!vc|KpPR)ZLP+o5q%E8FX^Aks7lshuos;*LhDB7nZU +e0@phkBj-I^xN}t`Lz5v9*svbA4uGdN5Ih#YvYU{i-G2cC~LG=1>G*6rFEWnJld7QT6o0Lv~uJ2J8kJ +FlgVnY53uJF$TdMbN6QIM;A?6t3WR%T{(>gn8PWxOXp0}t8CfVzm=gZ3C4XO0y)y7S)fmV!%zCD?IWbqOzzyQmm?JJd{4b(fiAVOlB +J+fVXsQ2!KDvJ$Ga~21|pW(%sPUDbbC;`aSqbLp1DfQV0%1yVKdUDY0@m7=M+zSI;$*IqVkLJ6zlh!W +@>v3?%;r+kQu{nFZk0n!;{MJtvTSHP(oLex;%(WmQVHESZT+L=nk_-RPgRBD;%0z9Edto^HJG?G3z|4 +)i0$F=N2&e6EJ@#(WVPxWlgu9f|f54#vq@69#!JFML6mjDiq2wX9Hux|8$U${N}D7dK|$mM9EJrRm`l +@4kW0&@7>U~(O&IoyObE>(@p)N;tpkh5&r;CO9KQH0000809AE2QW9d@%1;^q0B&sn03iSX0B~t=FJE +bHbY*gGVQepBZ*6U1Ze(*WX>N0LVQg$JaCyx={cqzomcJM1|G;`Mu#DPDr-!>+T- +lT2a^bdsjD%M?Fl>N`5<)41CYU&O2YPV@4I8(1K-(6h1IlsJ2zCZur;?qx5t8KB3lY3s}b)y?@?{1TZ +i@IwvE{4tGZJOPsh+vFE3*9YCtGX((v@HIICsn%P?ifYY@}^45I7_p&LF%V9=j9nb3AZf^1AddkjEcG +vV=d#piSD#X?|9Ot%`I<}?XF$d)oAC2|C(g=W|LOA?)`@U+7%7o@TxtNZ|3ZwXxB+r^0exldd>wXv07$62=?=FA2n|TnucJMP@NEM!#f=0ayPBT(`gITl%`EQc2+TG!C;3m@c +YA=Wijs?+X!%A1Xt`*Uho)%Ln-T%-Lt#^hO!tdE{e;1XSE6gE-&{Vxi7C?X9Q3IXKym9G!1bPPo4Vzh +e1k(Ln>sI6g=BF8|2-6-ln+8RM_hSQckQ-o;n8dlzA()#qNZ_v3%|bwif3SHcKiD6wxIjE*I)mB@%QB +H`}4EEByZlme*Nn8pZ9dVFPgSXOJ3dU?){Ubs*~HYzDdg;%1>hVzGhi?2s@{{LpPoAT(GP*% +~ppFLEVlX~lRdcI+YDv9?z8*|8Mb)+Go30QRr0Xs+=3hBM;j^k;wgQ>aprvc_x>t1z_G4S7U^)1EaQ$Qy&;p#SYV?T+I1EpX^$uc;#iHBZHfhdL?FZm26eWUTc$kW?ia +#(FF^bq~W--TN9&*M>ha7D%96U}aeBLfP!2^6jp2C|1-zJ!!`c2Xd!7Zl(>@{R-O*d#k9Gqwl0?EK}f +FHpLFa)d3rZM|FbfRnr2A)jEh*B4_yBPT^T>!<{50NxVzRd0E=r(MIVPjh(xuRwY*#*cv>%b#8qDMgK1ej#vAulSzmpC~ncorZ2){hiPEFq_(~ +gp+gRs0e>dJh9;fBE&FtjMqpN4I`GVNfepvxK2v_|OXrd5w5R#hI0>g}!-|on5-b#w^w64nCqF5~|&U2po&9Ze}WLzw-2JP6C19h9}b&w^H7xQLQR6whB{m>H+s6dDz +QRONE2H`|!U|EokR|?fr_FR3t9*G|&gwX^t4~JQ(G>RNKn4jCUfx#ft0;Y!D{F+Oh1kPq%(||_-Z)Fk +%?fsbm)fOupVN?d3fF8!fh6WWSpplr3&BvuVPRyMQzDJuvQV79QP0>;imPB?(7#xe$Z?4cYU$%24FY4rE#Ln8i~oGe=w9zf5<#uk>SW}x>xiC6%dy6hSu_-gbfC%YefMu;>F9i-+Od;Iu* +?B+;5wIdIQ)cqre_De}V-DyuJfE*kRD)neSOUTCsk#rN9v7seLhNf|U7*y_JPe)~Q(Yr!3ahx8NT{a+ +CTQ6D`G3U)*!(yU^yh{E^%?b+`2-$1%VNf*N@&CERFZtl7&k*#s>)Z(4WMFXk4C{HOf|kKykBtM$r2eQa7)*7mS^KdFlJ58;n#Fi_(7fg}Vq4SE?X|f>ar4I8eRuRTECx#ux(sZ%e56 +M9R4mxj(=cnnXK9-n^~`JC3*2%jgI-&+h-R9aCtgb#HS!#*3%F_RJRQ@1HM*%LSds?xs-`!_ubldV>r +nuN-Z&K0)u5>MR5%Uuz)x;q43w;JV@t0=x_}{oRGi)j{C_lTH1o*0Vv+7dIf@ANAyo$(5Xd$0cdCo3<8h#YBP;lM#?By}Lo=#4?=9NP +U0}+&FvU}CYx<@Qvl?VOv=2nae +m}3Wex&hxp0yDA-pR|&CU;F_^-m2M`yzuBP}cNl2S9*qA;)m4aZ%5lVc^c4FjIWUkM19IKW~)=J4I-g +Hge)LcH1YjI_gMlWq_gm(<&AS}c3}IBdFKJJck!NGz@IftLGq2|tq5OGWYFdnfi-9utwwd|p8ua6h1$ +d>EjVCgM_mc>>ahNoZ;G()#|p5CA`ZxZs-|^J2X3lMR=llDibWv@DbTJTzx74qy5YM(8A$@Ejt^M?(< +__(c?B4jHN_GN8|@jwF8r+TW|30PnsuG8U^Zqlzyx167#?27_2H9MjmxNC$8pnmGJm7J!w^OCL?&=tU +D~>IW9GhMWC`?XRCxLgy-~0Ic_wqF#!ic}11*KQ(t{CAH8lB6rW-5*@ISQFh#!fN +b`@9t)-QhCFnic0ke(PFlbOiH`2|D!2M=*G3iT$hO@gHL%?BcCY>%{JSYzR7mo%w~Lr|*Z6(bTvMZ>I +5houJzIt(dj9b8agY|FqCmc{v`~)5cr0YAFR8>EaIQ`NIXPMlviv~sEEBS4j?R*%v)tIwXpu +9qgzM|r|byIh@YusniGU|8N`_f2X2t0%@og+dN;4{btIU-B60%-Oj-(l8rZkvqWe;ln86Bm-X`4+CoIWl;=&fFiQlwSrH*-9)^?gSdue@U#o|Y*SAKHTfkb!yH +L63?l-Aa=xVCZ#+&@g+`fZhp(x(4`eV=q@0a$Sbg_ltU72RQR>T}>Sok^5&xgsrn~E5EN^LuYHykQ>g +cz8K4G8rt-;R%$}82b4Lu3b|(>6##lLt!2vLVY*O$YUmhBNZd5}prZ_>taaTUTt~*wy58_*XnifvR<3 +g&vFtrYzGdj)@0J5@cWNu!^iaPKMG<9jlk~DFgHZcfato0jr1SwkB0fhW_!wFr&A>-7Meh+D+%!;hvV +T6*%^k+}G6i&w9mhY(cbB}49AXYg-Jh5dkP$|Ae7Dr+rQ@`1ku+d*qA9xW>CCrjKs1WEJX1_AkP9sRF +RFfskPF0eq@`*c%VW=en{b}#Ag}kGl&lP%?+IC~q31S9m)7^ABNjqxHNA>@6BR-0N%K +ygC7+cNXnE=Wvog>8M5mv)O$_Z~>aa@wB?@2m%Xqi7ahSdPo7v1ooAE&~tyoe~&*@6Ehbd$TwK95 +x_>)Z|ogejTkKJfYf#F?xf7=kZ#~eUw<|~a`tg;sFWCB9(Gf=Yqo{<;EO2D!~;b5-8yGVPQz$~4aP40 +hs1PK--80-F#vD>v+sj04_$c)`M7dV{}On~3nZ}g!Mjr;nu0k9MI*F@YAK9DR&ChI&R0|QbZWU_H50# +~d}=q$(>C>5;iKubuSM>LyoHFrlWtRAyBfRsUa&pdGn*rX;b%*G{>O}JLEAT~rok~YF>P)7pp0lNA>y +(7c_2xes0O=2EU*RY&$pppSvX&_V~D8*mvC8@{ZT#%LmRLYd!k4DOyBy27|(^-P>=}5>{6Xw5 +0%K>n8LKOP~*8;^(qe#TjcAB*^fD2wXuSmNX7_ogeE2nbRSQ8i_VX-sz$n0lPF +YwHc9Me_WrK1O^96ao@+uuD7@obE!n=d?iFbLkk2AmW2*<^O67wfy-p{FK*c#m%N|I3IKj_Z!)r)1Mk +^eUYdEaDfy=B0%lKFdgHfOqjAPBcwk_@|hEbg;wQM9M-SRg`zFmEf`*nB5P@nSo92)m{^yR3@)8=*9r +|g_NS9NI@hlQRG!F`VrxKUwA516II%A%GPbW6{jaBx8Rw&8( +c{`+3vRK2{b;TrsAaH4<5KdDF)F;MzR(QgDI@!q5hqy^W^hEk{aZ#$2CZl+9nW1>nbt9+c}FiFb^PIK +Pdc|VOHkh;Dj=?6D>RHib%VEP(o}?+M>IsAbIaT7FjrV;uwxhTZLq%U$dYyBfvbKIk!RJ8Q=m}ve)T-foI_gdD1fkOdYvVhbdPz?)oAu3x{5`$3-q+=~Sv2B;}W +1eEG#fznMIRp!+Fl4!^eP9hdiaq*+#XRj@R5BDcf1mFBF|md;%EYleRuO>G@}{o~v7Q#{g*xCka7Z(@ +13EmegCZ5hj}2ASI47bj$w;;og8p@CA@j~I3KMzmV3f#aj)lQsQ!5Wo-ZP@v?ny;QWd64_i{e}Vl9~r1>P(dX;jXc1#u-8=t1?GXchXZanu>FIpt+l;pTfDmsqd1N!@bY4s{Y!B~2>eH_%Hc +nAIU)S#K+a~(M}L`X+~xlit5rODHCV@+4_EB2drsn-x;|ha%>AknVP=LN-0|qp$y(R#NvzOu&tVPjaE +)@gCX}N&1C!`!`ly)o)EkmVZ!B8kI(|CL-CGC<0?tUW**+b1SQM?(VTT*{$HNY{bq|Pzg?zv;ExA2|C +Xt?@hc +0vu!>C|yQT;vN(QW^_@Kgw!K823Haor=o9^>qAcO@*e9>NTsF5b*ZZ*b9N&yPLX#t0n0mCKx$~L`S7Z +ev1JCt6f8p5U8pN8+xq=%?jcHdZOB?D46SkFyXCifmd{v|s*7l_-k7+mFTI?G88KxKSTKY&JfKV2T49 +LC;|3k{HmzJWk7$|GZewSu?kP^_wQywzSJyC_E?V-iU;u1)rL2Tgc2jsvvj)TB$6g5!AMFjK4u=l=s{ +6ojQ`kl2-QeI3+zE(g;HUA7$gt7FI4ZklOrd4n+%$b^}g!j5h`l=t2(Od1x<)l^CPe +IYO~ljV0H6+Oy((p3LY@1sRQo&z;ng9X53Eo2^M%a)Mgrz|mrG+hIy^;ZJV^ON+xMm3f2RKgrI3H_Lk +{MsR^G&Wj9PIOV5ky=YM@epBfi}--LoE|FshyLi?U437Q%27slV&Kd(Cy|}hF;eKPkmP2_+~2 +DoNh=wfBo{CAI=lHDDmca0sr$>>7YV0+_r@k +_n%k=k!fs-Ewc0yBiRd*Gop}yfb1*xzjo{3zjhX1=6Z?=J5!bC;z3-#u$QFgc~NnW3_lAm3MU9Y8dbL>HnqrGdMEwFzG)SDPsZUpMjuj_i0N{FF=y>u +5|ICNg(kL1npRzWgWiWwFRxiH|kzO2<~{+k*QUS{@Sf7ne;7hzZ2C56MqF=EOcr|I29(mMA^Enl|xkq +-VnqBsrAGu76OyIl&I!o4R4f1w}TtIPubI~()xh?1tbwh$G*ION +=<0;)7#(RE6vYKaR5#eg_;u_10ae>f++(CpQD7;>ErMl?M+_8(oWW(v>`gr5gncfMMNZk{jq3jhG=EdT%>0001RX>c!JX>N37a&BR4FJo_QZDDR?b1!UZb963ndF2{w +kJ~o#dw~20!a-p9;1$}h3n;+dUfNq+E(w~nK(Sb;vP9dAWl1HaeYEI*zZt$nQj~YIN$$%TLDnW`hV$m +kNbK0PyeFST+dO~9)Q`H|?O3yW{_Od)EpLycV_llFrl-6q>a?sG(SYT#YP+7bjhKT>IsH8^+vBllDuZ +>|RP^pg-VWV`+L%QaebEmB@GB||_J^M@E?$555XGT)B~|JM@;ihTr;YLNdYM_PkliGB_Ch5tSdT}|;cizL~-p-t8D6wH@%D%ydUqwoLIQT`Ou3fj +>Aw&e%#E+GKYdL`>Vs1?M;AP0}lOthz<`Zsbd$@8W-(mY=w-1BE;T?ipL*U^+rB6y{hvsf(D7lbC(Yl +sdLv4*v>9xBw0aWjz`QFPb{QgBLYpa7VxAq6Q5LC=61Z3OGt4J88Pfz6gfe5KCO>MPqdEvKNq-v?4TAEigrd)uv7N7B$#+eCPt?_A1#$8iC=O3PgE +T}RXWp?yN>PnDT-5ty^(1XTiSR8PVsR-`GWsn&<4}1(vL#rqRrH3|ZFi(iPi`m|QV8;odqZALUf<$Yw}5#4yqJriE8_6wSL3U^s(Cr_2F>En@;tEhD4bA5Wsm$_P9p_vVN)}yEO20^#Uz#yBFJE +-qJzgf0IUX&OIzYu4)?=S3ZkSB93B7zO`!b0M6`q4|EDluD$#+<~2Fi0l6$uHnR?Ns^pPzC$1(9Nr%6 +tEu@74}ep_r%fJWZ_Jk~H58tgdpu|CGh)nrJx?U6%XNa#gh~Yo{xa1#Hl|8Z@U=CgcKIEU3zg(cG&0E +jlQDI?iyjZz0f`P_=^|0HibYYG}6eu?5fk?mI2zafuejikIoXo-JO00MM*JwrFqj`=U9}N?m=(km?JF +S{^SX&mvwso<%$Hz;UK$g)t`q;D4m5FIdZc3Ttz@jMIMLjc*d84gUyVgPH#`U?&hV3x3C#L5Jf*6S`N +ycjBaPVdB4nmi1b?7WAi1m~IW7)HWqpbeKg``=9&F^MZjb-KkEX3F%z#^blz5s3h&NWr2>e!Ru#3(Kk +1&p%v66uI`<5Q0{4Y$Zhpzl2Oe4!~trb3{>1F&KPDD6NH?1h@08qtJ~f^9{P)t +PlbxfJ*a7P&qYt^`1~f%hSU@sX80xKYLk2zLTR)VUKb@GEp^&{&55&Bf6RsUWvbA;&=|>#MqA%ed&FV +uku%&J-|PU{WJ;IyutWvbu*|@G6XIzj`TK&LNQM`;@$cQjg!Fr`jCpQUT{%%F`L(_H4`0KLydu$$EQ3 +%K}tRM0>Iz9I&Tu9&AT|`3G>y8QtA_JX)7GQp#S>~R8OJy==Z}Q+BMva2QR3FsYKQn +tYKRdxpbu~^;Z?a}Z&ZwT*6dEQr4zIrNsrmmlT4+}DWO>Elqu7l^Ifm?bW!He>Gp)1tDxM%3mDu%eE| +oT!b1Pbji@5W;VsU7n{6vj3arhHq*9HfuTkhe2c-y5?GQ5?u=Gl7yT5fRa>}UK6sucSW@YD6omC8t~d1N~)o&S?LZ8*Ye&k3uI417 +P27q)Yg&%rJd}~wU408kXajnBWU2~mi2otqQh&!_2-Gl;epAYPzOjk@voyP^cPr?YQTa7Mc3N;%PYT5 +xa3##4)dU5&e&2DGDLL$p^I``4B8z}$ND;Mf&@V8N9Xl +U^X&x|#7z^i9KQxMEjJsq!vfOtB&6lVEIvB5*L-0mr@XSjg~fHRg7Br?3G(5Rlq6ljJB<_q!>JA3$7G +2Y)32quEo7CMLGbEd8Qjt}mk)Gqg=1m9`gfr9x&FUvqxr?H^&r7~k@$aqZc(khkA`$0}}?yleoa^j?! +F}cQajlS_w9~eF-{NtWcDArv@FrUrTonJAl`wu1EI$1tO4I(Jy$~%eX%Bcu#CJ!6gCpcHTHv**@+_G(r{0iYd=En^&^1rx_h`R3bX>wzGTL@r +BjHA!ofng`VdNvr%V9T-V{a%a6JjM2&c5Ues$;umF!NIHb(QG+~8t%SdlLc9%pIX)= +kbo1NVD8Sz@@z@|M(#9sE58H4;DW1N#@0yml!E}YewzjDAIlzx-89KQHo?kQd9LRDL08ar=zY;PH^vv +t3>~$GBhpsReEL1UA~Oh_hbf%R{R3{B28ZyWX>i*%E!ku|W2F3h^$F);u4{sZ@#k;&Fjvm-$64xc@_i +hA9NSI~a_nI9_0>X8u^}leeo@hnU*E`E7QcN2O)s>ff<$wg%Gf%i1_9{Wau!Ri1SBh(`y_nZExB7ssq +eH`c{i=%AT2ta_a%!rI!7*6Cy$yZaA{s~8;8!aIfP7Uj`uPS9B@mQoDzJm3q1p>Bs9;`zA+??v^HTWA +2cI`OC+eWFqYB1orV>X59klM2$Hs3(umi=%5U?~jHfBMod(L&`E^VT+L}m$`$m%^h0hskYX&^GmUOL{Ctcn{H;(Rz;cvuU32Cf6PeMmYtKrxQbDR +GcP)h>@6aWAK2mn=eH&PEJM>XjO008V4001BW003}la4%nJZggdGZeeUMV{dJ3VQyq|FLPyKa${&NaC +x;DZExE)`g?%<2O>owsgs5D?uG*1T%ea`x8m}KI=S268GWWKJRGSSeH^)aze~WD+SboG(t^7zPr)vQj^ +ds?n4Zo%p=o0L;gH9V(c2$s}Y{v|`Hl6%SpFlZ4oE-1-_eo4(PvU)|Xu5Zt$}l(0=%aZ2QtDs;q?TV~ZB(Lk +`rWLMqO)-sQ~g4cPPYq`iPMQ3UV_ie>WNqLzS2>>U*XP{?Z?RHtYvb4_h=d(DRe)Uo2RG_5{<|TV%<+ +JDlOw|aWuK2LwTzPtJullk4*+4+1vN`*e=wC)9lVSLVc#Ya(gz^xDoD_8WlQqEU@*+#`O3IBT^BrYN=DfkoiwmG?+;(K%WcdV@xhU+?ZS|$7BW +a@xW8aZ(0i1Z?_PoCY=#jS$19V9bNs*B$;*lp$5Pw=tBi@xAhd1*^UNN0)~r8AR34YzHh%xJ_}etVHd +EvJQ(x{1xBw?4t$OK5^%$XS_{(@NvElTJ3h*bOb7`3jOSYue4+Utk7Yw-%zJWjqLBzFpdygyY6Q9Pu& +u!4$cDh45gy85DKiEp`|)c-`Tl(ZB&=~80f->3TGA$XUGr)~7M0GArNwF?bVY#j__bjiOI&%6cIFMWL +|1f8vehazBtk)pwG|&9TU)}2Ox}~Ls-)c>!Y27nA&aD=;kuubMhMjr*2}T-)-dR5p!?v2aW>z7eA))`=H);i_y7Dc`|DGOHd0B&L03dB#9bw={;qC4d;Z69^S_tDHl|z)G9G3OQ`a^ehZDZO5RDqz`N*w} +91;Gf)~P2WTZLD2NFYnUwo5^7J3j(6a|7b=vL;_CFd%i_@jcz2;zI93jBd*jC4lXW_BHX#*xU#ajiATE%j@Pz4e9myYBZ`Cy)udqg3c7PME#z@cRU +2sgj~S6TJb=mZ&nbaLo|q9w5jfm7_VNEtNb?B=*OrRja``byZo|kpJq~kQMq7fIW-7jguuMaX;u__lI +bm|?zZD6nP3M3{#K>r +3*C!BJ+`|GL|Fper(vAhEX02!VeF1{`fUuzne!Ired)m+oIEZBeNoayM{t>BbqzS${R&o7q^)Shd(cCgg?o|f~qo~ +X8u@0#QWH_}qyV5jCY}$j)iHqa4zzgs0FtGq;{--y6nlZ@B0Ig03;Y)~KLKmV36B@{WjN}c+#s1q3b|Dd^4rxZo2Rtf3egd}*V# +dDaT|DW1{$Ce=I;EGIQ=nup91*`OGi#NfU>lV*p_(&K{VG^q?HKd?dY>1uxa;o{=_B- +GduB%4cjL=}8S+Tvei^w;Pc4SP4ORzj#|FYzAozxZ%_KEIvf1}X~Z6HW^X=lmb6uY;HA^`1cc=%i+~M +JJO9P(4B886lsi_YKp1L;Nug=B#m7GMx9%OZAKM_+W4m&JgaGU0ZF(yKj5F0582^0K1<>jR}l)v!2sH +%s&B8O9KQH0000809AE2Ql5l5?MDaz0OT7003HAU0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*Wb7*gOE^v9 +xSzB-8wi131kpDnc%2F+#zCoNDIhDuAc%|@0~kxEW_(EomBc#%j+c6R%8w2QSaGsC +%j{5a(DLsiz2dpC?5vzC=CoinX%2uj+-X%2?Wm +Bh248_1^`b=@qxRE>;RxPDPS@4wR{4bUi^uYWvcp+I`&^%6a9&e~%Nm?Ebw8*UfrG7lBBP5lL0IiI*V +_q+pUzZVi{N?iU`tfm8RrwenxJa$iYt1D~%0^a=JfR}rDu~f4efjO-x8(At>&u^$>z`~)d!RZ2$p64thy5>y8I0kAz?LkbXkZ>qRL6$ +d{GpJ~lb6QA(;3IoRGw@oE5Ie)`+eUyzh^h66kRPhL+>sSz4IC0{@-H*)ClbeTE5~;Qcn28$v*GXyuz +UeCPj$nr>5Od&&9cN83I)rzHUW5jz`V0L38!TCiQGfX-8Ynt(}PkLac3p$MDPk`+aQ8}XIq{#5k&r1z +^GgVqn~Js))s+~7=#3`hss;pczp-Ca4Wm +6GRNEtd=IyWLK9>6@HBTTuj~U)=ij4I^8FB8YD +PxLZvnx1X0xxT4Hp2sBx@Ds&0uY)xsn(R!g!1x%m2s#xeI5K=N}1Tw%g4xLxI6Om`x!EZ*ec`&Zhm0e=-5_LkE4wXB~3 +!--(hDP(J4HCREzDh7c60RyYY=^DnUEI?J|)O!Tzh_X^qzNk3??kE*gHdqk_t~`KkSb13H0ClD0tzv{ +xp!Q$9(r}5~v8M=oltAc%R2z;N$IK59G9x;n_viM5hGqyx(b~3bifm4P5Jik-019$Q4`c$LA(WgC(|ZWX+xey%Hx_JOu&^tSs_PWH8o0fYLDW?HvviPdBuwXzlxsFm(i{gV-E2{oUOnYb9#6U-X)m1CVY;C4~<`;H^kpsB{-8 +Q=>#ZtX;voTcEishyMD@%m=c(zWlnp5=89FCeO$Q7G7Gbo+C!1iYQwj!~nD^yge0(6$t}vG3XD4SI!G +XX-W$dX0;OarPCb&E-XQc4N)={(2UA3h=S?rqlP8E#-b@h>l6B=i1A)Cj*k;kO&x+qg%Lw;rCMV(^lt +DQR*?_A5qsZ~!Y|iP7grZg7o$mZ05Qm;tJ-NYXf_9h|B6fcD~C?2!ETFJfk4()4tGoBH&uLW@g4Kr*5 +GLQM-6>fEx~cs{rvyb^5N&tv)lWdum7NyovJ(3_%N)Hz{eFNLXH=}6*yIcp`qSlrEiD0dO7gaoz6$yJg#nr)I0&qSA}B|UMLoKwTi>l99P`bj6S;|ejq=}GArk}^+p;UGI84r@97J( +O{`Y^9pgg{1n%#MiG7*<+gTeJtTE=eXW^XmxZXK3G2VwZUyh6&BFUiH2TQI_n!_f5}PTzduk^1x;lq!)#012NUz-AtWf;d9PY20PS26>V+62h|(9z9S$)_%QWLaEoVV