diff --git a/.gitmodules b/.gitmodules
index 26763fb16012..1c7a6da0281d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -68,3 +68,6 @@
[submodule "platform/p4/SAI-P4-BM"]
path = platform/p4/SAI-P4-BM
url = https://github.com/Mellanox/SAI-P4-BM.git
+[submodule "platform/nephos/sonic-platform-modules-ingrasys"]
+ path = platform/nephos/sonic-platform-modules-ingrasys
+ url = https://github.com/Ingrasys-sonic/sonic-platform-modules-ingrasys-nephos.git
diff --git a/README.md b/README.md
index 5ba616c027e0..0a361e38abec 100644
--- a/README.md
+++ b/README.md
@@ -53,6 +53,7 @@ The SONiC installer contains all docker images needed. SONiC uses one image for
- PLATFORM=mellanox
- PLATFORM=cavium
- PLATFORM=centec
+- PLATFORM=nephos
- PLATFORM=p4
- PLATFORM=vs
@@ -96,9 +97,11 @@ This may take a while, but it is a one-time action, so please be patient.
- docker-orchagent-brcm.gz: docker image for SWitch State Service (SWSS) on Broadcom platform (gzip tar archive)
- docker-orchagent-cavm.gz: docker image for SWitch State Service (SWSS) on Cavium platform (gzip tar archive)
- docker-orchagent-mlnx.gz: docker image for SWitch State Service (SWSS) on Mellanox platform (gzip tar archive)
+ - docker-orchagent-nephos.gz: docker image for SWitch State Service (SWSS) on Nephos platform (gzip tar archive)
- docker-syncd-brcm.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive)
- docker-syncd-cavm.gz: docker image for the daemon to sync database and Cavium switch ASIC (gzip tar archive)
- docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive)
+ - docker-syncd-nephos.gz: docker image for the daemon to sync database and Nephos switch ASIC (gzip tar archive)
- docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive)
- docker-sonic-vs.gz: docker image for all-in-one for software virtual switch (gzip tar archive)
diff --git a/build_debian.sh b/build_debian.sh
index 0c765fdb6424..15bde44c112e 100755
--- a/build_debian.sh
+++ b/build_debian.sh
@@ -144,6 +144,9 @@ sudo chroot $FILESYSTEM_ROOT update-initramfs -u
## Install latest intel igb driver
sudo cp target/debs/igb.ko $FILESYSTEM_ROOT/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/igb/igb.ko
+## Install latest intel ixgbe driver
+sudo cp target/debs/ixgbe.ko $FILESYSTEM_ROOT/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko
+
## Install docker
echo '[INFO] Install docker'
## Install apparmor utils since they're missing and apparmor is enabled in the kernel
diff --git a/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/port_config.ini b/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/port_config.ini
new file mode 100644
index 000000000000..74865956f61b
--- /dev/null
+++ b/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/port_config.ini
@@ -0,0 +1,55 @@
+# name lanes
+Ethernet0 0
+Ethernet1 1
+Ethernet2 2
+Ethernet3 3
+Ethernet4 4
+Ethernet5 5
+Ethernet6 6
+Ethernet7 7
+Ethernet8 8
+Ethernet9 9
+Ethernet10 10
+Ethernet11 11
+Ethernet12 12
+Ethernet13 13
+Ethernet14 14
+Ethernet15 15
+Ethernet16 16
+Ethernet17 17
+Ethernet18 18
+Ethernet19 19
+Ethernet20 20
+Ethernet21 21
+Ethernet22 22
+Ethernet23 23
+Ethernet24 24
+Ethernet25 25
+Ethernet26 26
+Ethernet27 27
+Ethernet28 28
+Ethernet29 29
+Ethernet30 30
+Ethernet31 31
+Ethernet32 32
+Ethernet33 33
+Ethernet34 34
+Ethernet35 35
+Ethernet36 36
+Ethernet37 37
+Ethernet38 38
+Ethernet39 39
+Ethernet40 40
+Ethernet41 41
+Ethernet42 42
+Ethernet43 43
+Ethernet44 44
+Ethernet45 45
+Ethernet46 46
+Ethernet47 47
+Ethernet48 48
+Ethernet49 49
+Ethernet50 50
+Ethernet51 51
+Ethernet52 52
+Ethernet53 53
diff --git a/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/qos.json b/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/qos.json
new file mode 100644
index 000000000000..3e01af3f2c64
--- /dev/null
+++ b/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/qos.json
@@ -0,0 +1,166 @@
+{
+ "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"
+ }
+ },
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": {
+ "AZURE": {
+ "0": "0",
+ "1": "1",
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "PORT_QOS_MAP": {
+ "Ethernet0,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_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]",
+ "pfc_enable": "3,4"
+ }
+ },
+ "WRED_PROFILE": {
+ "AZURE_LOSSY": {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184320",
+ "green_min_threshold": "184320"
+ },
+ "AZURE_LOSSLESS": {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184320",
+ "green_min_threshold": "184320"
+ }
+ },
+ "QUEUE": {
+ "Ethernet0,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,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]"
+ },
+ "Ethernet0,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-1": {
+ "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]"
+ },
+ "Ethernet0,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]",
+ "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]"
+ }
+ }
+}
+
diff --git a/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/sai.profile b/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/sai.profile
new file mode 100644
index 000000000000..178dcd002853
--- /dev/null
+++ b/device/accton/x86_64-accton_as7212_54x-r0/AS7212-54x/sai.profile
@@ -0,0 +1,2 @@
+mode=1
+hwId=as7212-54x
diff --git a/device/accton/x86_64-accton_as7212_54x-r0/installer.conf b/device/accton/x86_64-accton_as7212_54x-r0/installer.conf
new file mode 100644
index 000000000000..14404194ef53
--- /dev/null
+++ b/device/accton/x86_64-accton_as7212_54x-r0/installer.conf
@@ -0,0 +1,3 @@
+CONSOLE_PORT=0x2f8
+CONSOLE_DEV=1
+CONSOLE_SPEED=115200
diff --git a/device/accton/x86_64-accton_as7212_54x-r0/minigraph.xml b/device/accton/x86_64-accton_as7212_54x-r0/minigraph.xml
new file mode 100644
index 000000000000..8dd87023110c
--- /dev/null
+++ b/device/accton/x86_64-accton_as7212_54x-r0/minigraph.xml
@@ -0,0 +1,1074 @@
+
+
+
+
+
+ ARISTA01T0
+ 10.0.0.33
+ switch1
+ 10.0.0.32
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.0
+ ARISTA01T2
+ 10.0.0.1
+ 1
+ 180
+ 60
+
+
+ ARISTA02T0
+ 10.0.0.35
+ switch1
+ 10.0.0.34
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.2
+ ARISTA02T2
+ 10.0.0.3
+ 1
+ 180
+ 60
+
+
+ ARISTA03T0
+ 10.0.0.37
+ switch1
+ 10.0.0.36
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.4
+ ARISTA03T2
+ 10.0.0.5
+ 1
+ 180
+ 60
+
+
+ ARISTA04T0
+ 10.0.0.39
+ switch1
+ 10.0.0.38
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.6
+ ARISTA04T2
+ 10.0.0.7
+ 1
+ 180
+ 60
+
+
+ ARISTA05T0
+ 10.0.0.41
+ switch1
+ 10.0.0.40
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.8
+ ARISTA05T2
+ 10.0.0.9
+ 1
+ 180
+ 60
+
+
+ ARISTA06T0
+ 10.0.0.43
+ switch1
+ 10.0.0.42
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.10
+ ARISTA06T2
+ 10.0.0.11
+ 1
+ 180
+ 60
+
+
+ ARISTA07T0
+ 10.0.0.45
+ switch1
+ 10.0.0.44
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.12
+ ARISTA07T2
+ 10.0.0.13
+ 1
+ 180
+ 60
+
+
+ ARISTA08T0
+ 10.0.0.47
+ switch1
+ 10.0.0.46
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.14
+ ARISTA08T2
+ 10.0.0.15
+ 1
+ 180
+ 60
+
+
+ ARISTA09T0
+ 10.0.0.49
+ switch1
+ 10.0.0.48
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.16
+ ARISTA09T2
+ 10.0.0.17
+ 1
+ 180
+ 60
+
+
+ ARISTA10T0
+ 10.0.0.51
+ switch1
+ 10.0.0.50
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.18
+ ARISTA10T2
+ 10.0.0.19
+ 1
+ 180
+ 60
+
+
+ ARISTA11T0
+ 10.0.0.53
+ switch1
+ 10.0.0.52
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.20
+ ARISTA11T2
+ 10.0.0.21
+ 1
+ 180
+ 60
+
+
+ ARISTA12T0
+ 10.0.0.55
+ switch1
+ 10.0.0.54
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.22
+ ARISTA12T2
+ 10.0.0.23
+ 1
+ 180
+ 60
+
+
+ ARISTA13T0
+ 10.0.0.57
+ switch1
+ 10.0.0.56
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.24
+ ARISTA13T2
+ 10.0.0.25
+ 1
+ 180
+ 60
+
+
+ ARISTA14T0
+ 10.0.0.59
+ switch1
+ 10.0.0.58
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.26
+ ARISTA14T2
+ 10.0.0.27
+ 1
+ 180
+ 60
+
+
+ ARISTA15T0
+ 10.0.0.61
+ switch1
+ 10.0.0.60
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.28
+ ARISTA15T2
+ 10.0.0.29
+ 1
+ 180
+ 60
+
+
+ ARISTA16T0
+ 10.0.0.63
+ switch1
+ 10.0.0.62
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.30
+ ARISTA16T2
+ 10.0.0.31
+ 1
+ 180
+ 60
+
+
+
+
+ 65100
+ switch1
+
+
+ 10.0.0.33
+
+
+
+
+ 10.0.0.1
+
+
+
+
+ 10.0.0.35
+
+
+
+
+ 10.0.0.3
+
+
+
+
+ 10.0.0.37
+
+
+
+
+ 10.0.0.5
+
+
+
+
+ 10.0.0.39
+
+
+
+
+ 10.0.0.7
+
+
+
+
+ 10.0.0.41
+
+
+
+
+ 10.0.0.9
+
+
+
+
+ 10.0.0.43
+
+
+
+
+ 10.0.0.11
+
+
+
+
+ 10.0.0.45
+
+
+
+
+ 10.0.0.13
+
+
+
+
+ 10.0.0.47
+
+
+
+
+ 10.0.0.15
+
+
+
+
+ 10.0.0.49
+
+
+
+
+ 10.0.0.17
+
+
+
+
+ 10.0.0.51
+
+
+
+
+ 10.0.0.19
+
+
+
+
+ 10.0.0.53
+
+
+
+
+ 10.0.0.21
+
+
+
+
+ 10.0.0.55
+
+
+
+
+ 10.0.0.23
+
+
+
+
+ 10.0.0.57
+
+
+
+
+ 10.0.0.25
+
+
+
+
+ 10.0.0.59
+
+
+
+
+ 10.0.0.27
+
+
+
+
+ 10.0.0.61
+
+
+
+
+ 10.0.0.29
+
+
+
+
+ 10.0.0.63
+
+
+
+
+ 10.0.0.31
+
+
+
+
+
+
+
+ 64001
+ ARISTA01T0
+
+
+
+ 65200
+ ARISTA01T2
+
+
+
+ 64002
+ ARISTA02T0
+
+
+
+ 65200
+ ARISTA02T2
+
+
+
+ 64003
+ ARISTA03T0
+
+
+
+ 65200
+ ARISTA03T2
+
+
+
+ 64004
+ ARISTA04T0
+
+
+
+ 65200
+ ARISTA04T2
+
+
+
+ 64005
+ ARISTA05T0
+
+
+
+ 65200
+ ARISTA05T2
+
+
+
+ 64006
+ ARISTA06T0
+
+
+
+ 65200
+ ARISTA06T2
+
+
+
+ 64007
+ ARISTA07T0
+
+
+
+ 65200
+ ARISTA07T2
+
+
+
+ 64008
+ ARISTA08T0
+
+
+
+ 65200
+ ARISTA08T2
+
+
+
+ 64009
+ ARISTA09T0
+
+
+
+ 65200
+ ARISTA09T2
+
+
+
+ 64010
+ ARISTA10T0
+
+
+
+ 65200
+ ARISTA10T2
+
+
+
+ 64011
+ ARISTA11T0
+
+
+
+ 65200
+ ARISTA11T2
+
+
+
+ 64012
+ ARISTA12T0
+
+
+
+ 65200
+ ARISTA12T2
+
+
+
+ 64013
+ ARISTA13T0
+
+
+
+ 65200
+ ARISTA13T2
+
+
+
+ 64014
+ ARISTA14T0
+
+
+
+ 65200
+ ARISTA14T2
+
+
+
+ 64015
+ ARISTA15T0
+
+
+
+ 65200
+ ARISTA15T2
+
+
+
+ 64016
+ ARISTA16T0
+
+
+
+ 65200
+ ARISTA16T2
+
+
+
+
+
+
+
+
+
+ HostIP
+ Loopback0
+
+ 10.1.0.32/32
+
+ 10.1.0.32/32
+
+
+
+
+
+
+
+ switch1
+
+
+
+
+
+ Ethernet0
+ 10.0.0.0/31
+
+
+
+ Ethernet4
+ 10.0.0.2/31
+
+
+
+ Ethernet8
+ 10.0.0.4/31
+
+
+
+ Ethernet12
+ 10.0.0.6/31
+
+
+
+ Ethernet16
+ 10.0.0.8/31
+
+
+
+ Ethernet20
+ 10.0.0.10/31
+
+
+
+ Ethernet24
+ 10.0.0.12/31
+
+
+
+ Ethernet28
+ 10.0.0.14/31
+
+
+
+ Ethernet32
+ 10.0.0.16/31
+
+
+
+ Ethernet36
+ 10.0.0.18/31
+
+
+
+ Ethernet40
+ 10.0.0.20/31
+
+
+
+ Ethernet44
+ 10.0.0.22/31
+
+
+
+ Ethernet48
+ 10.0.0.24/31
+
+
+
+ Ethernet52
+ 10.0.0.26/31
+
+
+
+ Ethernet56
+ 10.0.0.28/31
+
+
+
+ Ethernet60
+ 10.0.0.30/31
+
+
+
+ Ethernet64
+ 10.0.0.32/31
+
+
+
+ Ethernet68
+ 10.0.0.34/31
+
+
+
+ Ethernet72
+ 10.0.0.36/31
+
+
+
+ Ethernet76
+ 10.0.0.38/31
+
+
+
+ Ethernet80
+ 10.0.0.40/31
+
+
+
+ Ethernet84
+ 10.0.0.42/31
+
+
+
+ Ethernet88
+ 10.0.0.44/31
+
+
+
+ Ethernet92
+ 10.0.0.46/31
+
+
+
+ Ethernet96
+ 10.0.0.48/31
+
+
+
+ Ethernet100
+ 10.0.0.50/31
+
+
+
+ Ethernet104
+ 10.0.0.52/31
+
+
+
+ Ethernet108
+ 10.0.0.54/31
+
+
+
+ Ethernet112
+ 10.0.0.56/31
+
+
+
+ Ethernet116
+ 10.0.0.58/31
+
+
+
+ Ethernet120
+ 10.0.0.60/31
+
+
+
+ Ethernet124
+ 10.0.0.62/31
+
+
+
+
+
+
+
+
+
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet0
+ ARISTA01T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet4
+ ARISTA02T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet8
+ ARISTA03T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet12
+ ARISTA04T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet16
+ ARISTA05T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet20
+ ARISTA06T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet24
+ ARISTA07T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet28
+ ARISTA08T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet32
+ ARISTA09T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet36
+ ARISTA10T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet40
+ ARISTA11T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet44
+ ARISTA12T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet48
+ ARISTA13T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet52
+ ARISTA14T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet56
+ ARISTA15T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet60
+ ARISTA16T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet64
+ ARISTA01T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet68
+ ARISTA02T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet72
+ ARISTA03T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet76
+ ARISTA04T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet80
+ ARISTA05T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet84
+ ARISTA06T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet88
+ ARISTA07T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet92
+ ARISTA08T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet96
+ ARISTA09T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet100
+ ARISTA10T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet104
+ ARISTA11T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet108
+ ARISTA12T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet112
+ ARISTA13T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet116
+ ARISTA14T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet120
+ ARISTA15T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet124
+ ARISTA16T0
+ Ethernet1
+
+
+
+
+ switch1
+ AS7212-54x
+
+
+
+
+
+
+ switch1
+
+
+ DhcpResources
+
+
+
+
+ NtpResources
+
+ 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org
+
+
+ SyslogResources
+
+
+
+
+
+
+
+
+ switch1
+ AS7212-54x
+
diff --git a/device/accton/x86_64-accton_as7212_54x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7212_54x-r0/plugins/eeprom.py
new file mode 100644
index 000000000000..7681caafeef4
--- /dev/null
+++ b/device/accton/x86_64-accton_as7212_54x-r0/plugins/eeprom.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+try:
+ import exceptions
+ import binascii
+ import time
+ import optparse
+ import warnings
+ import os
+ import sys
+ from sonic_eeprom import eeprom_base
+ from sonic_eeprom import eeprom_tlvinfo
+ import subprocess
+except ImportError, 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/1-0057/eeprom"
+ #Two i2c buses might get flipped order, check them both.
+ if not os.path.exists(self.eeprom_path):
+ self.eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom"
+ super(board, self).__init__(self.eeprom_path, 0, '', True)
diff --git a/device/accton/x86_64-accton_as7212_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7212_54x-r0/plugins/sfputil.py
new file mode 100644
index 000000000000..6dc35d72bb21
--- /dev/null
+++ b/device/accton/x86_64-accton_as7212_54x-r0/plugins/sfputil.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+
+try:
+ from sonic_sfp.sfputilbase import sfputilbase
+except ImportError, e:
+ raise ImportError (str(e) + "- required module not found")
+
+
+class sfputil(sfputilbase):
+ """Platform specific sfputil class"""
+
+ port_start = 0
+ port_end = 31
+ ports_in_block = 32
+
+ port_to_eeprom_mapping = {}
+ port_to_i2c_mapping = {
+ 9 : 18,
+ 10 : 19,
+ 11 : 20,
+ 12 : 21,
+ 1 : 22,
+ 2 : 23,
+ 3 : 24,
+ 4 : 25,
+ 6 : 26,
+ 5 : 27,
+ 8 : 28,
+ 7 : 29,
+ 13 : 30,
+ 14 : 31,
+ 15 : 32,
+ 16 : 33,
+ 17 : 34,
+ 18 : 35,
+ 19 : 36,
+ 20 : 37,
+ 25 : 38,
+ 26 : 39,
+ 27 : 40,
+ 28 : 41,
+ 29 : 42,
+ 30 : 43,
+ 31 : 44,
+ 32 : 45,
+ 21 : 46,
+ 22 : 47,
+ 23 : 48,
+ 24 : 49,
+ }
+
+ _qsfp_ports = range(0, ports_in_block + 1)
+
+ def __init__(self, port_num):
+ # Override port_to_eeprom_mapping for class initialization
+ eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom'
+ for x in range(self.port_start, self.port_end + 1):
+ port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1])
+ self.port_to_eeprom_mapping[x] = port_eeprom_path
+ sfputilbase.__init__(self, port_num)
diff --git a/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini b/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini
index b9a831f22e8d..fd0e7f88b625 100644
--- a/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini
+++ b/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini
@@ -1,33 +1,55 @@
# name lanes
-Ethernet0 1
-Ethernet4 2
-Ethernet8 3
-Ethernet12 4
-Ethernet16 5
-Ethernet20 6
-Ethernet24 7
-Ethernet28 8
-Ethernet32 9
-Ethernet36 10
-Ethernet40 11
-Ethernet44 12
-Ethernet48 13
-Ethernet52 14
-Ethernet56 15
-Ethernet60 16
-Ethernet64 17
-Ethernet68 18
-Ethernet72 19
-Ethernet76 20
-Ethernet80 21
-Ethernet84 22
-Ethernet88 23
-Ethernet92 24
-Ethernet96 25
-Ethernet100 26
-Ethernet104 27
-Ethernet108 28
-Ethernet112 29
-Ethernet116 30
-Ethernet120 31
-Ethernet124 32
+Ethernet1 1
+Ethernet2 2
+Ethernet3 3
+Ethernet4 4
+Ethernet5 5
+Ethernet6 6
+Ethernet7 7
+Ethernet8 8
+Ethernet9 9
+Ethernet10 10
+Ethernet11 11
+Ethernet12 12
+Ethernet13 13
+Ethernet14 14
+Ethernet15 15
+Ethernet16 16
+Ethernet17 17
+Ethernet18 18
+Ethernet19 19
+Ethernet20 20
+Ethernet21 21
+Ethernet22 22
+Ethernet23 23
+Ethernet24 24
+Ethernet25 25
+Ethernet26 26
+Ethernet27 27
+Ethernet28 28
+Ethernet29 29
+Ethernet30 30
+Ethernet31 31
+Ethernet32 32
+Ethernet33 33
+Ethernet34 34
+Ethernet35 35
+Ethernet36 36
+Ethernet37 37
+Ethernet38 38
+Ethernet39 39
+Ethernet40 40
+Ethernet41 41
+Ethernet42 42
+Ethernet43 43
+Ethernet44 44
+Ethernet45 45
+Ethernet46 46
+Ethernet47 47
+Ethernet48 48
+Ethernet49 49
+Ethernet50 50
+Ethernet51 51
+Ethernet52 52
+Ethernet53 53
+Ethernet54 54
\ No newline at end of file
diff --git a/device/centec/x86_64-centec_e582_48x6q-r0/installer.conf b/device/centec/x86_64-centec_e582_48x6q-r0/installer.conf
index 5e62742c11bf..7d60bf73d366 100644
--- a/device/centec/x86_64-centec_e582_48x6q-r0/installer.conf
+++ b/device/centec/x86_64-centec_e582_48x6q-r0/installer.conf
@@ -1 +1,2 @@
CONSOLE_SPEED=115200
+ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=no"
diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/psuutil.py b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/psuutil.py
new file mode 100644
index 000000000000..7e69360b0402
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/psuutil.py
@@ -0,0 +1,92 @@
+#
+# 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")
+
+
+class PsuUtil(PsuBase):
+ """Platform-specific PSUutil class"""
+
+ SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/i2c-3/3-0051",
+ "/sys/bus/i2c/devices/i2c-4/4-0051"]
+
+ def __init__(self):
+ PsuBase.__init__(self)
+
+
+ # Get sysfs attribute
+ def get_attr_value(self, attr_path):
+
+ retval = 'ERR'
+ if (not os.path.isfile(attr_path)):
+ return retval
+
+ try:
+ with open(attr_path, 'r') as fd:
+ retval = fd.read()
+ except Exception as error:
+ logging.error("Unable to open ", attr_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_pg'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU status
+ if (attr_value == 1):
+ status = 1
+
+ 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
+ psu_absent = 0
+ attr_file ='psu_abs'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU presence
+ if (attr_value == 0):
+ status = 1
+
+ return status
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/psuutil.py b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/psuutil.py
new file mode 100644
index 000000000000..4f226c69fff3
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/psuutil.py
@@ -0,0 +1,92 @@
+#
+# 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")
+
+
+class PsuUtil(PsuBase):
+ """Platform-specific PSUutil class"""
+
+ PSU_CPLD_DIR = "/sys/bus/i2c/devices/0-0033"
+
+ def __init__(self):
+ PsuBase.__init__(self)
+
+
+ # Get sysfs attribute
+ def get_attr_value(self, attr_path):
+
+ retval = 'ERR'
+ if (not os.path.isfile(attr_path)):
+ return retval
+
+ try:
+ with open(attr_path, 'r') as fd:
+ retval = fd.read()
+ except Exception as error:
+ logging.error("Unable to open ", attr_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
+ mask = [ 0x08, 0x10 ]
+ attr_file = 'cpld_pw_good'
+ attr_path = self.PSU_CPLD_DIR +'/'+ attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU status
+ if (attr_value & mask[index-1]):
+ status = 1
+
+ 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
+ mask = [ 0x01, 0x02 ]
+ attr_file ='cpld_pw_abs'
+ attr_path = self.PSU_CPLD_DIR +'/'+ attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU presence
+ if (~attr_value & mask[index-1]):
+ status = 1
+
+ return status
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf
index c55f5c764e65..5535db7e7eb4 100644
--- a/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf
+++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf
@@ -9,14 +9,24 @@ chip "jc42-*"
chip "w83795adg-*"
label in0 "1.0V"
+ set in0_min 1.00 * 0.97
+ set in0_max 1.00 * 1.03
label in1 "1.0V_ROV"
+ set in1_min 1.00 * 0.98
+ set in1_max 1.00 * 1.02
label in2 "1.25V"
+ set in2_min 1.25 * 0.97
+ set in2_max 1.25 * 1.03
label in3 "1.8V"
+ set in3_min 1.80 * 0.97
+ set in3_max 1.80 * 1.03
ignore in4
ignore in5
ignore in6
ignore in7
label in12 "+3.3V"
+ set in12_min 3.30 * 0.97
+ set in12_max 3.30 * 1.03
ignore in14
ignore in15
ignore in16
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.ini
new file mode 100644
index 000000000000..bb26684cb7da
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.ini
@@ -0,0 +1,33 @@
+# name lanes alias index
+Ethernet0 0,1,2,3 Ethernet1/1 0
+Ethernet4 4,5,6,7 Ethernet2/1 1
+Ethernet8 8,9,10,11 Ethernet3/1 2
+Ethernet12 12,13,14,15 Ethernet4/1 3
+Ethernet16 16,17,18,19 Ethernet5/1 4
+Ethernet20 20,21,22,23 Ethernet6/1 5
+Ethernet24 24,25,26,27 Ethernet7/1 6
+Ethernet28 28,29,30,31 Ethernet8/1 7
+Ethernet32 32,33,34,35 Ethernet9/1 8
+Ethernet36 36,37,38,39 Ethernet10/1 9
+Ethernet40 40,41,42,43 Ethernet11/1 10
+Ethernet44 44,45,46,47 Ethernet12/1 11
+Ethernet48 48,49,50,51 Ethernet13/1 12
+Ethernet52 52,53,54,55 Ethernet14/1 13
+Ethernet56 56,57,58,59 Ethernet15/1 14
+Ethernet60 60,61,62,63 Ethernet16/1 15
+Ethernet64 64,65,66,67 Ethernet17/1 16
+Ethernet68 68,69,70,71 Ethernet18/1 17
+Ethernet72 72,73,74,75 Ethernet19/1 18
+Ethernet76 76,77,78,79 Ethernet20/1 19
+Ethernet80 80,81,82,83 Ethernet21/1 20
+Ethernet84 84,85,86,87 Ethernet22/1 21
+Ethernet88 88,89,90,91 Ethernet23/1 22
+Ethernet92 92,93,94,95 Ethernet24/1 23
+Ethernet96 96,97,98,99 Ethernet25/1 24
+Ethernet100 100,101,102,103 Ethernet26/1 25
+Ethernet104 104,105,106,107 Ethernet27/1 26
+Ethernet108 108,109,110,111 Ethernet28/1 27
+Ethernet112 112,113,114,115 Ethernet29/1 28
+Ethernet116 116,117,118,119 Ethernet30/1 29
+Ethernet120 120,121,122,123 Ethernet31/1 30
+Ethernet124 124,125,126,127 Ethernet32/1 31
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.nps b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.nps
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/sai.profile b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/sai.profile
new file mode 100644
index 000000000000..880f47910ac1
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/sai.profile
@@ -0,0 +1,2 @@
+SAI_INIT_CONFIG_FILE=/usr/share/sonic/platform/led_proc_init.nps
+SAI_DSH_CONFIG_FILE=/usr/share/sonic/hwsku/port_config.nps
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/fancontrol
new file mode 100644
index 000000000000..5ed165966b93
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/fancontrol
@@ -0,0 +1,12 @@
+# Configuration file generated by pwmconfig, changes will be lost
+INTERVAL=10
+DEVPATH=hwmon5=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-8/8-002f
+DEVNAME=hwmon5=w83795adg
+FCTEMPS=hwmon5/device/pwm2=hwmon1/temp1_input hwmon5/device/pwm1=hwmon1/temp1_input
+FCFANS=hwmon5/device/pwm2=hwmon5/device/fan8_input hwmon5/device/pwm2=hwmon5/device/fan7_input hwmon5/device/pwm2=hwmon5/device/fan6_input hwmon5/device/pwm2=hwmon5/device/fan5_input hwmon5/device/pwm1=hwmon5/device/fan4_input hwmon5/device/pwm1=hwmon5/device/fan3_input hwmon5/device/pwm1=hwmon5/device/fan2_input hwmon5/device/pwm1=hwmon5/device/fan1_input
+# TODO: check the temp value with HW after board ready
+MINTEMP=hwmon5/device/pwm2=20 hwmon5/device/pwm1=20
+MAXTEMP=hwmon5/device/pwm2=60 hwmon5/device/pwm1=60
+MINSTART=hwmon5/device/pwm2=75 hwmon5/device/pwm1=75
+MINSTOP=hwmon5/device/pwm2=22 hwmon5/device/pwm1=22
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/installer.conf
new file mode 100644
index 000000000000..925a32fc0c3a
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/installer.conf
@@ -0,0 +1,3 @@
+CONSOLE_PORT=0x3f8
+CONSOLE_DEV=0
+CONSOLE_SPEED=115200
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/led_proc_init.nps b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/led_proc_init.nps
new file mode 100644
index 000000000000..b482a7a0b977
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/led_proc_init.nps
@@ -0,0 +1,20 @@
+#This configuration file is for customer init value feature. Please refer to mtk_cfg.h/mtk_cfg.c for detail.
+#1. The lines beginning with # are comment lines. The lines beginning with number are the setting lines.
+#2. There are five parameters which can be set.
+# 1) the first is unit.
+# 2) the second is NPS_CFG_TYPE_XXX. Refer to NPS_CFG_TYPE_T.
+# 3) the 3-5 are {param0, param1, value} pairs. Refer to NPS_CFG_VALUE_T. Support HEX format.
+# 4) the (unit, NPS_CFG_TYPE_XXX, param0, param1) group is the key to get the correspingding value.
+# There should be no same (unit, NPS_CFG_TYPE_XXX, param0, param1) group.
+#3. User must follow correct format to apply the setting. Please refer to below commentted example(#0 NPS_CFG_TYPE_L2_ADDR_MODE 0 0 1);
+#4. Usage under the linux shell:
+# 1) ./image-path/image-name -c cfg-path/NPS_Ari_EVB_24.cfg : mamually specify directory path if they are not in current work dirctory.
+# 2) ./image-name -c NPS_Ari_EVB_24.cfg : the image and the NPS_Ari_EVB_24.cfg are in the current work directory.
+
+#unit NPS_CFG_TYPE_XXX param0 param1 value
+#---- ---------------- ------ ------ -----
+0 NPS_CFG_TYPE_USE_UNIT_PORT 0 0 1
+0 NPS_CFG_TYPE_LED_CFG 0 0 1
+0 NPS_CFG_TYPE_CPI_PORT_MODE 129 0 0
+0 NPS_CFG_TYPE_CPI_PORT_MODE 130 0 0
+0 NPS_CFG_TYPE_USER_BUF_CTRL 0 0 1
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/minigraph.xml
new file mode 100644
index 000000000000..6b29a7eb83b8
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/minigraph.xml
@@ -0,0 +1,151 @@
+
+
+
+
+
+ OCPSCH0104001MS
+ 10.10.1.26
+ OCPSCH01040GGLF
+ 10.10.1.25
+ 1
+ 10
+ 3
+
+
+ OCPSCH0104002MS
+ 10.10.2.26
+ OCPSCH01040GGLF
+ 10.10.2.25
+ 1
+ 10
+ 3
+
+
+
+
+ 64536
+ OCPSCH01040GGLF
+
+
+ 10.10.1.26
+
+
+
+
+ 10.10.2.26
+
+
+
+
+
+
+
+ 64542
+ OCPSCH0104001MS
+
+
+
+ 64543
+ OCPSCH0104002MS
+
+
+
+
+
+
+
+
+
+ HostIP
+ Loopback0
+
+ 100.0.0.9/32
+
+ 100.0.0.9/32
+
+
+
+
+
+
+
+ OCPSCH01040GGLF
+
+
+
+
+
+ Ethernet0
+ 10.10.1.25/30
+
+
+
+ Ethernet4
+ 10.10.2.25/30
+
+
+
+
+
+
+
+
+
+
+
+ 40000
+ DeviceInterfaceLink
+ OCPSCH0104001MS
+ Ethernet24
+ OCPSCH01040GGLF
+ Ethernet0
+
+
+ 40000
+ DeviceInterfaceLink
+ OCPSCH0104002MS
+ Ethernet24
+ OCPSCH01040GGLF
+ Ethernet4
+
+
+
+
+ OCPSCH01040GGLF
+ INGRASYS-S9130-32X
+
+
+
+
+
+
+ OCPSCH01040GGLF
+
+
+ DhcpResources
+
+
+
+
+ NtpResources
+
+ 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org
+
+
+ SyslogResources
+
+
+
+
+ ErspanDestinationIpv4
+
+ 2.2.2.2
+
+
+
+
+
+
+ OCPSCH01040GGLF
+ INGRASYS-S9130-32X
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/eeprom.py
new file mode 100644
index 000000000000..0f47704ed2cb
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/eeprom.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+
+#############################################################################
+# Ingrasys S9130-32X
+#
+# 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-0055/eeprom"
+ super(board, self).__init__(self.eeprom_path, 0, '', True)
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/psuutil.py b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/psuutil.py
new file mode 100644
index 000000000000..4a029c15b1a6
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/psuutil.py
@@ -0,0 +1,92 @@
+#
+# 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")
+
+
+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, attr_path):
+
+ retval = 'ERR'
+ if (not os.path.isfile(attr_path)):
+ return retval
+
+ try:
+ with open(attr_path, 'r') as fd:
+ retval = fd.read()
+ except Exception as error:
+ logging.error("Unable to open ", attr_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_pg'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU status
+ if (attr_value == 1):
+ status = 1
+
+ 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
+ psu_absent = 0
+ attr_file ='psu_abs'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU presence
+ if (attr_value == 0):
+ status = 1
+
+ return status
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/sfputil.py
new file mode 100644
index 000000000000..387c8155eef2
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/sfputil.py
@@ -0,0 +1,187 @@
+# 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"""
+
+ PORT_START = 0
+ PORT_END = 31
+ PORTS_IN_BLOCK = 32
+ EEPROM_OFFSET = 21
+ ABS_GPIO_BASE_0_15 = 240
+ ABS_GPIO_BASE_16_31 = 224
+ LP_MODE_GPIO_BASE_0_15 = 176
+ LP_MODE_GPIO_BASE_16_31 = 160
+ RST_GPIO_BASE_0_15 = 144
+ RST_GPIO_BASE_16_31 = 128
+
+ GPIO_VAL_PATH = "/sys/class/gpio/gpio{0}/value"
+
+ _port_to_eeprom_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 range(0, self.PORTS_IN_BLOCK + 1)
+
+ @property
+ def port_to_eeprom_mapping(self):
+ return self._port_to_eeprom_mapping
+
+
+ def __init__(self):
+ # Override port_to_eeprom_mapping for class initialization
+ eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom'
+ for x in range(self.port_start, self.port_end + 1):
+ port_eeprom_path = eeprom_path.format(x + self.EEPROM_OFFSET)
+ self.port_to_eeprom_mapping[x] = port_eeprom_path
+
+ 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
+
+ # open corrsponding gpio file
+ try:
+ if port_num <= 15:
+ gpio_base = self.ABS_GPIO_BASE_0_15
+ else :
+ gpio_base = self.ABS_GPIO_BASE_16_31
+ gpio_index = gpio_base + (port_num % 16)
+ gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index)
+ gpio_file = open(gpio_file_path)
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # content is a string containing the gpio value
+ gpio_val = int(gpio_file.readline().rstrip())
+ gpio_file.close()
+
+ # the gpio pin is ACTIVE_LOW but reversed
+ if gpio_val == 0:
+ return False
+
+ 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
+
+ # open corrsponding gpio file
+ try:
+ if port_num <= 15:
+ gpio_base = self.LP_MODE_GPIO_BASE_0_15
+ else :
+ gpio_base = self.LP_MODE_GPIO_BASE_16_31
+ gpio_index = gpio_base + (port_num % 16)
+ gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index)
+ gpio_file = open(gpio_file_path)
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # content is a string containing the gpio value
+ gpio_val = int(gpio_file.readline().rstrip())
+ gpio_file.close()
+
+ if gpio_val == 0:
+ return False
+
+ return True
+
+ def set_low_power_mode(self, port_num, lpmode):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ # open corrsponding gpio file
+ try:
+ if port_num <= 15:
+ gpio_base = self.LP_MODE_GPIO_BASE_0_15
+ else :
+ gpio_base = self.LP_MODE_GPIO_BASE_16_31
+ gpio_index = gpio_base + (port_num % 16)
+ gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index)
+ gpio_file = open(gpio_file_path, "r+")
+ 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:
+ gpio_val = "1"
+ else:
+ gpio_val = "0"
+
+ # write value to gpio
+ gpio_file.seek(0)
+ gpio_file.write(gpio_val)
+ gpio_file.close()
+
+ return True
+
+ def reset(self, port_num):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ # open corrsponding gpio file
+ try:
+ if port_num <= 15:
+ gpio_base = self.RST_GPIO_BASE_0_15
+ else :
+ gpio_base = self.RST_GPIO_BASE_16_31
+ gpio_index = gpio_base + (port_num % 16)
+ gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index)
+ gpio_file = open(gpio_file_path, "w")
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # set the gpio to take port into reset
+ # the gpio pin is ACTIVE_LOW but reversed
+ gpio_val = "1"
+ # write value to gpio
+ gpio_file.seek(0)
+ gpio_file.write(gpio_val)
+ gpio_file.close()
+
+ # Sleep 1 second to let it settle
+ time.sleep(1)
+
+ # open corrsponding gpio file
+ try:
+ gpio_file = open(gpio_file_path, "w")
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # set gpio back low to take port out of reset
+ # the gpio pin is ACTIVE_LOW but reversed
+ gpio_val = "0"
+ # write value to gpio
+ gpio_file.seek(0)
+ gpio_file.write(gpio_val)
+ gpio_file.close()
+
+ return True
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/sensors.conf
new file mode 100644
index 000000000000..9b55f73af2af
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/sensors.conf
@@ -0,0 +1,69 @@
+# libsensors configuration file
+chip "i350bb-*"
+ ignore loc1
+
+chip "jc42-*"
+
+bus "i2c-8" "i2c-mux-0 (chan_id 7)"
+chip "w83795adg-*"
+ label in0 "0.9V"
+ set in0_max 0.945
+ set in0_min 0.855
+ label in1 "VDD_CORE"
+ set in1_max 0.945
+ set in1_min 0.855
+ label in2 "1.2V"
+ set in2_max 1.26
+ set in2_min 1.14
+ label in3 "1.8V"
+ set in3_max 1.89
+ set in3_min 1.71
+ label in4 "1.01V"
+ set in4_max 1.0605
+ set in4_min 0.9595
+ ignore in5
+ ignore in6
+ ignore in7
+ ignore in11
+ label in12 "3.3VDD"
+ set in12_max 3.465
+ set in12_min 3.135
+ # in12 and in13 are the same source
+ ignore in13
+ label fan1 "FANTRAY 1-A"
+ label fan2 "FANTRAY 1-B"
+ label fan3 "FANTRAY 2-A"
+ label fan4 "FANTRAY 2-B"
+ label fan5 "FANTRAY 3-A"
+ label fan6 "FANTRAY 3-B"
+ label fan7 "FANTRAY 4-A"
+ label fan8 "FANTRAY 4-B"
+ ignore temp1
+ ignore temp2
+ ignore temp3
+ ignore temp4
+ ignore temp5
+ ignore temp6
+ ignore intrusion0
+
+chip "tmp75-i2c-*-4A"
+ label temp1 "BMC board Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+bus "i2c-0" "i2c-main"
+chip "tmp75-i2c-*-4F"
+ label temp1 "x86 CPU board Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+bus "i2c-12" "i2c-mux-1 (chan_id 3)"
+chip "tmp75-i2c-*-4C"
+ label temp1 "rear MAC Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+chip "tmp75-i2c-*-49"
+ label temp1 "front MAC Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/psuutil.py b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/psuutil.py
new file mode 100644
index 000000000000..cc996057e09e
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/psuutil.py
@@ -0,0 +1,92 @@
+#
+# 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")
+
+
+class PsuUtil(PsuBase):
+ """Platform-specific PSUutil class"""
+
+ SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/i2c-18/18-0050",
+ "/sys/bus/i2c/devices/i2c-17/17-0050"]
+
+ def __init__(self):
+ PsuBase.__init__(self)
+
+
+ # Get sysfs attribute
+ def get_attr_value(self, attr_path):
+
+ retval = 'ERR'
+ if (not os.path.isfile(attr_path)):
+ return retval
+
+ try:
+ with open(attr_path, 'r') as fd:
+ retval = fd.read()
+ except Exception as error:
+ logging.error("Unable to open ", attr_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_pg'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU status
+ if (attr_value == 1):
+ status = 1
+
+ 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
+ psu_absent = 0
+ attr_file ='psu_abs'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU presence
+ if (attr_value == 0):
+ status = 1
+
+ return status
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf
index ef694e96a056..065c1ebddf36 100644
--- a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf
+++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf
@@ -49,20 +49,30 @@ chip "w83795adg-*"
ignore temp3
ignore temp4
ignore intrusion0
+
+chip "tmp75-i2c-*-4A"
+ label temp1 "BMC Board Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+chip "tmp75-i2c-*-4F"
+ label temp1 "x86 CPU Board Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
bus "i2c-6" "i2c-0-mux (chan_id 5)"
chip "lm75-i2c-6-4E"
label temp1 "MAC Temp"
set temp1_max 50
set temp1_max_hyst 45
-bus "i2c-6" "i2c-0-mux (chan_id 5)"
chip "lm75-i2c-6-4D"
- label temp1 "REAR Temp"
+ label temp1 "REAR MAC Temp"
set temp1_max 50
set temp1_max_hyst 45
bus "i2c-7" "i2c-0-mux (chan_id 6)"
chip "lm75-i2c-7-4D"
- label temp1 "Front Temp"
+ label temp1 "Front MAC Temp"
set temp1_max 50
set temp1_max_hyst 45
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.ini
new file mode 100644
index 000000000000..ddd76b51167f
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.ini
@@ -0,0 +1,65 @@
+# name lanes alias index
+Ethernet0 7,6,5,4 Ethernet1/1 0
+Ethernet4 3,2,1,0 Ethernet2/1 1
+Ethernet8 15,14,13,12 Ethernet3/1 2
+Ethernet12 11,10,9,8 Ethernet4/1 3
+Ethernet16 23,22,21,20 Ethernet5/1 4
+Ethernet20 19,18,17,16 Ethernet6/1 5
+Ethernet24 31,30,29,28 Ethernet7/1 6
+Ethernet28 27,26,25,24 Ethernet8/1 7
+Ethernet32 39,38,37,36 Ethernet9/1 8
+Ethernet36 35,34,33,32 Ethernet10/1 9
+Ethernet40 47,46,45,44 Ethernet11/1 10
+Ethernet44 43,42,41,40 Ethernet12/1 11
+Ethernet48 55,54,53,52 Ethernet13/1 12
+Ethernet52 51,50,49,48 Ethernet14/1 13
+Ethernet56 63,62,61,60 Ethernet15/1 14
+Ethernet60 59,58,57,56 Ethernet16/1 15
+Ethernet64 71,70,69,68 Ethernet17/1 16
+Ethernet68 67,66,65,64 Ethernet18/1 17
+Ethernet72 79,78,77,76 Ethernet19/1 18
+Ethernet76 75,74,73,72 Ethernet20/1 19
+Ethernet80 87,86,85,84 Ethernet21/1 20
+Ethernet84 83,82,81,80 Ethernet22/1 21
+Ethernet88 95,94,93,92 Ethernet23/1 22
+Ethernet92 91,90,89,88 Ethernet24/1 23
+Ethernet96 97,98,99,100 Ethernet25/1 24
+Ethernet100 101,102,103,104 Ethernet26/1 25
+Ethernet104 105,106,107,108 Ethernet27/1 26
+Ethernet108 109,110,111,112 Ethernet28/1 27
+Ethernet112 119,118,117,116 Ethernet29/1 28
+Ethernet116 115,114,113,112 Ethernet30/1 29
+Ethernet120 127,126,125,124 Ethernet31/1 30
+Ethernet124 123,122,121,120 Ethernet32/1 31
+Ethernet128 135,134,133,132 Ethernet33/1 32
+Ethernet132 131,130,129,128 Ethernet34/1 33
+Ethernet136 143,142,141,140 Ethernet35/1 34
+Ethernet140 139,138,137,136 Ethernet36/1 35
+Ethernet144 151,150,149,148 Ethernet37/1 36
+Ethernet148 147,146,145,144 Ethernet38/1 37
+Ethernet152 159,158,157,156 Ethernet39/1 38
+Ethernet156 155,154,153,152 Ethernet40/1 39
+Ethernet160 167,166,165,164 Ethernet41/1 40
+Ethernet164 163,162,161,160 Ethernet42/1 41
+Ethernet168 175,174,173,172 Ethernet43/1 42
+Ethernet172 171,170,169,168 Ethernet44/1 43
+Ethernet176 183,182,181,180 Ethernet45/1 44
+Ethernet180 179,178,177,176 Ethernet46/1 45
+Ethernet184 191,190,189,188 Ethernet47/1 46
+Ethernet188 187,186,185,184 Ethernet48/1 47
+Ethernet192 199,198,197,196 Ethernet49/1 48
+Ethernet196 195,194,193,192 Ethernet50/1 49
+Ethernet200 207,206,205,204 Ethernet51/1 50
+Ethernet204 203,202,201,200 Ethernet52/1 51
+Ethernet208 215,214,213,212 Ethernet53/1 52
+Ethernet212 211,210,209,208 Ethernet54/1 53
+Ethernet216 223,222,221,220 Ethernet55/1 54
+Ethernet220 219,218,217,216 Ethernet56/1 55
+Ethernet224 231,230,229,228 Ethernet57/1 56
+Ethernet228 227,226,225,224 Ethernet58/1 57
+Ethernet232 239,238,237,236 Ethernet59/1 58
+Ethernet236 235,234,233,232 Ethernet60/1 59
+Ethernet240 247,246,245,244 Ethernet61/1 60
+Ethernet244 243,242,241,240 Ethernet62/1 61
+Ethernet248 255,254,253,252 Ethernet63/1 62
+Ethernet252 251,250,249,248 Ethernet64/1 63
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.nps b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.nps
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/sai.profile b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/sai.profile
new file mode 100644
index 000000000000..880f47910ac1
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/sai.profile
@@ -0,0 +1,2 @@
+SAI_INIT_CONFIG_FILE=/usr/share/sonic/platform/led_proc_init.nps
+SAI_DSH_CONFIG_FILE=/usr/share/sonic/hwsku/port_config.nps
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/fancontrol
new file mode 100644
index 000000000000..86b4e636375f
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/fancontrol
@@ -0,0 +1,9 @@
+INTERVAL=10
+DEVPATH=hwmon7=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-16/16-002f hwmon4=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-7/7-004e
+DEVNAME=hwmon7=w83795adg
+FCTEMPS=hwmon7/device/pwm2=hwmon4/temp1_input
+FCFANS=hwmon7/device/pwm2=hwmon7/device/fan7_input hwmon7/device/pwm2=hwmon7/device/fan5_input hwmon7/device/pwm2=hwmon7/device/fan3_input hwmon7/device/pwm2=hwmon7/device/fan1_input
+MINTEMP=hwmon7/device/pwm2=20
+MAXTEMP=hwmon7/device/pwm2=60
+MINSTART=hwmon7/device/pwm2=75
+MINSTOP=hwmon7/device/pwm2=22
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/installer.conf
new file mode 100644
index 000000000000..925a32fc0c3a
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/installer.conf
@@ -0,0 +1,3 @@
+CONSOLE_PORT=0x3f8
+CONSOLE_DEV=0
+CONSOLE_SPEED=115200
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/led_proc_init.nps b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/led_proc_init.nps
new file mode 100644
index 000000000000..e6fe6721350e
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/led_proc_init.nps
@@ -0,0 +1,20 @@
+#This configuration file is for customer init value feature. Please refer to nps_cfg.h/nps_cfg.c for detail.
+#1. The lines beginning with # are comment lines. The lines beginning with number are the setting lines.
+#2. There are five parameters which can be set.
+# 1) the first is unit.
+# 2) the second is NPS_CFG_TYPE_XXX. Refer to NPS_CFG_TYPE_T.
+# 3) the 3-5 are {param0, param1, value} pairs. Refer to NPS_CFG_VALUE_T. Support HEX format.
+# 4) the (unit, NPS_CFG_TYPE_XXX, param0, param1) group is the key to get the correspingding value.
+# There should be no same (unit, NPS_CFG_TYPE_XXX, param0, param1) group.
+#3. User must follow correct format to apply the setting. Please refer to below commentted example(#0 NPS_CFG_TYPE_L2_ADDR_MODE 0 0 1);
+#4. Usage under the linux shell:
+# 1) ./image-path/image-name -c cfg-path/NPS_TAU_EVB_6T4_64.cfg : mamually specify directory path if they are not in current work dirctory.
+# 2) ./image-name -c NPS_TAU_EVB_6T4_64.cfg : the image and the NPS_TAU_EVB_3T2_32.cfg are in the current work directory.
+
+#unit NPS_CFG_TYPE_XXX param0 param1 value
+#---- ---------------- ------ ------ -----
+0 NPS_CFG_TYPE_USE_UNIT_PORT 0 0 1
+0 NPS_CFG_TYPE_LED_CFG 0 0 2
+0 NPS_CFG_TYPE_CPI_PORT_MODE 129 0 0
+0 NPS_CFG_TYPE_CPI_PORT_MODE 130 0 0
+0 NPS_CFG_TYPE_USER_BUF_CTRL 0 0 1
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/minigraph.xml
new file mode 100644
index 000000000000..9ac02997e44d
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/minigraph.xml
@@ -0,0 +1,151 @@
+
+
+
+
+
+ OCPSCH0104001MS
+ 10.10.1.26
+ OCPSCH01040GGLF
+ 10.10.1.25
+ 1
+ 10
+ 3
+
+
+ OCPSCH0104002MS
+ 10.10.2.26
+ OCPSCH01040GGLF
+ 10.10.2.25
+ 1
+ 10
+ 3
+
+
+
+
+ 64536
+ OCPSCH01040GGLF
+
+
+ 10.10.1.26
+
+
+
+
+ 10.10.2.26
+
+
+
+
+
+
+
+ 64542
+ OCPSCH0104001MS
+
+
+
+ 64543
+ OCPSCH0104002MS
+
+
+
+
+
+
+
+
+
+ HostIP
+ Loopback0
+
+ 100.0.0.9/32
+
+ 100.0.0.9/32
+
+
+
+
+
+
+
+ OCPSCH01040GGLF
+
+
+
+
+
+ Ethernet0
+ 10.10.1.25/30
+
+
+
+ Ethernet4
+ 10.10.2.25/30
+
+
+
+
+
+
+
+
+
+
+
+ 40000
+ DeviceInterfaceLink
+ OCPSCH0104001MS
+ Ethernet24
+ OCPSCH01040GGLF
+ Ethernet0
+
+
+ 40000
+ DeviceInterfaceLink
+ OCPSCH0104002MS
+ Ethernet24
+ OCPSCH01040GGLF
+ Ethernet4
+
+
+
+
+ OCPSCH01040GGLF
+ INGRASYS-S9230-64X
+
+
+
+
+
+
+ OCPSCH01040GGLF
+
+
+ DhcpResources
+
+
+
+
+ NtpResources
+
+ 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org
+
+
+ SyslogResources
+
+
+
+
+ ErspanDestinationIpv4
+
+ 2.2.2.2
+
+
+
+
+
+
+ OCPSCH01040GGLF
+ INGRASYS-S9230-64X
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/eeprom.py
new file mode 100644
index 000000000000..ab398102c9b5
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/eeprom.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+
+#############################################################################
+# Ingrasys S9230-64X
+#
+# 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-0055/eeprom"
+ super(board, self).__init__(self.eeprom_path, 0, '', True)
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/psuutil.py b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/psuutil.py
new file mode 100644
index 000000000000..cc996057e09e
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/psuutil.py
@@ -0,0 +1,92 @@
+#
+# 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")
+
+
+class PsuUtil(PsuBase):
+ """Platform-specific PSUutil class"""
+
+ SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/i2c-18/18-0050",
+ "/sys/bus/i2c/devices/i2c-17/17-0050"]
+
+ def __init__(self):
+ PsuBase.__init__(self)
+
+
+ # Get sysfs attribute
+ def get_attr_value(self, attr_path):
+
+ retval = 'ERR'
+ if (not os.path.isfile(attr_path)):
+ return retval
+
+ try:
+ with open(attr_path, 'r') as fd:
+ retval = fd.read()
+ except Exception as error:
+ logging.error("Unable to open ", attr_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_pg'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU status
+ if (attr_value == 1):
+ status = 1
+
+ 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
+ psu_absent = 0
+ attr_file ='psu_abs'
+ attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+ attr_value = self.get_attr_value(attr_path)
+
+ if (attr_value != 'ERR'):
+ attr_value = int(attr_value, 16)
+ # Check for PSU presence
+ if (attr_value == 0):
+ status = 1
+
+ return status
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/sfputil.py
new file mode 100644
index 000000000000..70e5ebff403d
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/sfputil.py
@@ -0,0 +1,293 @@
+# 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"""
+
+ PORT_START = 0
+ PORT_END = 63
+ PORTS_IN_BLOCK = 64
+ #TODO: modify according to port map
+ EEPROM_OFFSET = 33
+ CPLD1_PORTS = 12
+ CPLDx_PORTS = 13
+ CPLD_OFFSET = 1
+ CPLD_PRES_BIT = 1
+ CPLD_RESET_BIT = 0
+ CPLD_LPMOD_BIT = 2
+ CPLDx_I2C_ADDR = "33"
+ CPLD_PORT_STATUS_KEY = "cpld_qsfp_port_status"
+ CPLD_PORT_CONFIG_KEY = "cpld_qsfp_port_config"
+ CPLD_REG_PATH = "/sys/bus/i2c/devices/{0}-00{1}/{2}_{3}"
+
+ _port_to_eeprom_mapping = {}
+
+ _logic_to_phy_port_mapping = {
+ 0: 0,
+ 1: 1,
+ 2: 4,
+ 3: 5,
+ 4: 8,
+ 5: 9,
+ 6: 12,
+ 7: 13,
+ 8: 16,
+ 9: 17,
+ 10: 20,
+ 11: 21,
+ 12: 24,
+ 13: 25,
+ 14: 28,
+ 15: 29,
+ 16: 32,
+ 17: 33,
+ 18: 36,
+ 19: 37,
+ 20: 40,
+ 21: 41,
+ 22: 44,
+ 23: 45,
+ 24: 48,
+ 25: 49,
+ 26: 52,
+ 27: 53,
+ 28: 56,
+ 29: 57,
+ 30: 60,
+ 31: 61,
+ 32: 2,
+ 33: 3,
+ 34: 6,
+ 35: 7,
+ 36: 10,
+ 37: 11,
+ 38: 14,
+ 39: 15,
+ 40: 18,
+ 41: 19,
+ 42: 22,
+ 43: 23,
+ 44: 26,
+ 45: 27,
+ 46: 30,
+ 47: 31,
+ 48: 34,
+ 49: 35,
+ 50: 38,
+ 51: 39,
+ 52: 42,
+ 53: 43,
+ 54: 46,
+ 55: 47,
+ 56: 50,
+ 57: 51,
+ 58: 54,
+ 59: 55,
+ 60: 58,
+ 61: 59,
+ 62: 62,
+ 63: 63
+ }
+
+ @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.PORTS_IN_BLOCK + 1)
+
+ @property
+ def port_to_eeprom_mapping(self):
+ return self._port_to_eeprom_mapping
+
+
+ def __init__(self):
+ # Override port_to_eeprom_mapping for class initialization
+ eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom"
+ for x in range(self.port_start, self.port_end + 1):
+ phy_port = self._logic_to_phy_port_mapping[x]
+ port_eeprom_path = eeprom_path.format(phy_port + self.EEPROM_OFFSET)
+ self.port_to_eeprom_mapping[x] = port_eeprom_path
+
+ SfpUtilBase.__init__(self)
+
+ def qsfp_to_cpld_index(self, port_num):
+ if port_num < self.CPLD1_PORTS:
+ cpld_id = 0
+ cpld_port_index = port_num + 1
+ else:
+ cpld_id = 1 + (port_num - self.CPLD1_PORTS) / self.CPLDx_PORTS
+ cpld_port_index = ((port_num - self.CPLD1_PORTS) % self.CPLDx_PORTS) + 1
+ return cpld_id, cpld_port_index
+
+ 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
+
+ # logic port to physical port mapping
+ port_num = self._logic_to_phy_port_mapping[port_num]
+
+ cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num)
+ i2c_id = self.CPLD_OFFSET + cpld_id
+ reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \
+ self.CPLD_PORT_STATUS_KEY, cpld_port_index)
+
+ try:
+ reg_file = open(reg_path)
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # content is a string containing the status register value
+ content = reg_file.readline().rstrip()
+ reg_file.close()
+
+ reg_value = int(content, 16)
+ # mask for presence bit (bit 1)
+ mask = (1 << self.CPLD_PRES_BIT)
+
+ # 0 - presence, 1 - absence
+ if reg_value & mask == 0:
+ return True
+
+ return False
+
+ def get_low_power_mode(self, port_num):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ # logic port to physical port mapping
+ port_num = self._logic_to_phy_port_mapping[port_num]
+
+ cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num)
+ i2c_id = self.CPLD_OFFSET + cpld_id
+ reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \
+ self.CPLD_PORT_CONFIG_KEY, cpld_port_index)
+
+ try:
+ reg_file = open(reg_path)
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # content is a string containing the status register value
+ content = reg_file.readline().rstrip()
+ reg_file.close()
+
+ reg_value = int(content, 16)
+ # mask for lp_mod bit (bit 2)
+ mask = (1 << self.CPLD_LPMOD_BIT)
+
+ # 0 - disable, 1 - low power mode
+ if reg_value & mask == 0:
+ return False
+
+ return True
+
+ def set_low_power_mode(self, port_num, lpmode):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ # logic port to physical port mapping
+ port_num = self._logic_to_phy_port_mapping[port_num]
+
+ cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num)
+ i2c_id = self.CPLD_OFFSET + cpld_id
+ reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \
+ self.CPLD_PORT_CONFIG_KEY, cpld_port_index)
+
+ try:
+ reg_file = open(reg_path, "r+")
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # content is a string containing the status register value
+ content = reg_file.readline().rstrip()
+ reg_value = int(content, 16)
+ # mask for lp_mod bit (bit 2)
+ mask = (1 << self.CPLD_LPMOD_BIT)
+
+ # 1 - low power mode, 0 - high power mode
+ if lpmode is True:
+ reg_value = reg_value | mask
+ else:
+ reg_value = reg_value & ~mask
+
+ # convert value to hex string
+ content = hex(reg_value)
+
+ reg_file.seek(0)
+ reg_file.write(content)
+ reg_file.close()
+
+ return True
+
+ def reset(self, port_num):
+ # Check for invalid port_num
+ if port_num < self.port_start or port_num > self.port_end:
+ return False
+
+ # logic port to physical port mapping
+ port_num = self._logic_to_phy_port_mapping[port_num]
+
+ cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num)
+ i2c_id = self.CPLD_OFFSET + cpld_id
+ reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \
+ self.CPLD_PORT_CONFIG_KEY, cpld_port_index)
+
+ # reset the port
+ try:
+ reg_file = open(reg_path, "r+")
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ # content is a string containing the status register value
+ content = reg_file.readline().rstrip()
+ reg_value = int(content, 16)
+ # mask for reset bit (bit 0)
+ mask = (1 << self.CPLD_RESET_BIT)
+
+ # 1 - out of reset, 0 - reset
+ reg_value = reg_value & ~mask
+
+ reg_file.seek(0)
+ reg_file.write(hex(reg_value))
+ reg_file.close()
+
+ # Sleep 1 second to reset done
+ time.sleep(1)
+
+ # take the port out of reset
+ try:
+ reg_file = open(reg_path, "w")
+ except IOError as e:
+ print "Error: unable to open file: %s" % str(e)
+ return False
+
+ reg_value = reg_value | mask
+
+ reg_file.seek(0)
+ reg_file.write(hex(reg_value))
+ reg_file.close()
+
+ return True
+
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/sensors.conf
new file mode 100644
index 000000000000..b5daa9af42b7
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/sensors.conf
@@ -0,0 +1,90 @@
+# libsensors configuration file
+chip "i350bb-*"
+ ignore loc1
+
+chip "jc42-*"
+
+bus "i2c-16" "i2c-mux-1 (chan_id 7)"
+chip "w83795adg-*"
+ ignore in0
+ label in1 "VDD_CORE"
+ set in1_min 0.90 * 0.98
+ set in1_max 0.90 * 1.02
+ ignore in2
+ label in3 "1.8V"
+ set in3_min 1.8 * 0.97
+ set in3_max 1.8 * 1.03
+ label in4 "3.3V"
+ compute in4 @/(0.3052), (0.3052)*@
+ set in4_min 3.3 * 0.95
+ set in4_max 3.3 * 1.05
+ label in5 "0.9V"
+ set in5_min 0.90 * 0.98
+ set in5_max 0.90 * 1.02
+ ignore in6
+ ignore in7
+ ignore in8
+ ignore in9
+ ignore in10
+ ignore in11
+ ignore in12
+ ignore in13
+ ignore in14
+ ignore in15
+ ignore in16
+ ignore in17
+ ignore in18
+ ignore in19
+ label fan1 "FANTRAY 1"
+ #label fan2 "FANTRAY 1-B"
+ ignore fan2
+ label fan3 "FANTRAY 2"
+ #label fan4 "FANTRAY 2-B"
+ ignore fan4
+ label fan5 "FANTRAY 3"
+ #label fan6 "FANTRAY 3-B"
+ ignore fan6
+ label fan7 "FANTRAY 4"
+ #label fan8 "FANTRAY 4-B"
+ ignore fan8
+ ignore temp1
+ ignore temp2
+ ignore temp3
+ ignore temp4
+ ignore temp5
+ ignore temp6
+ ignore intrusion0
+
+# TODO: need to confirm the critial temp value with HW after board ready
+chip "tmp75-i2c-*-4A"
+ label temp1 "BMC board Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+bus "i2c-0" "SMBus I801 adapter at f000"
+chip "tmp75-i2c-*-4F"
+ label temp1 "x86 CPU board Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+bus "i2c-6" "i2c-0-mux (chan_id 5)"
+chip "lm75-i2c-6-4D"
+ label temp1 "Rear Panel Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+chip "lm75-i2c-6-4E"
+ label temp1 "Rear MAC Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+bus "i2c-7" "i2c-0-mux (chan_id 6)"
+chip "lm75-i2c-7-4D"
+ label temp1 "Front Panel Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+chip "lm75-i2c-7-4E"
+ label temp1 "Front MAC Temp"
+ set temp1_max 50
+ set temp1_max_hyst 45
+
+
diff --git a/device/marvell/x86_64-marvell_slm5401_54x-r0/SLM5401-54x/port_config.ini b/device/marvell/x86_64-marvell_slm5401_54x-r0/SLM5401-54x/port_config.ini
new file mode 100644
index 000000000000..74865956f61b
--- /dev/null
+++ b/device/marvell/x86_64-marvell_slm5401_54x-r0/SLM5401-54x/port_config.ini
@@ -0,0 +1,55 @@
+# name lanes
+Ethernet0 0
+Ethernet1 1
+Ethernet2 2
+Ethernet3 3
+Ethernet4 4
+Ethernet5 5
+Ethernet6 6
+Ethernet7 7
+Ethernet8 8
+Ethernet9 9
+Ethernet10 10
+Ethernet11 11
+Ethernet12 12
+Ethernet13 13
+Ethernet14 14
+Ethernet15 15
+Ethernet16 16
+Ethernet17 17
+Ethernet18 18
+Ethernet19 19
+Ethernet20 20
+Ethernet21 21
+Ethernet22 22
+Ethernet23 23
+Ethernet24 24
+Ethernet25 25
+Ethernet26 26
+Ethernet27 27
+Ethernet28 28
+Ethernet29 29
+Ethernet30 30
+Ethernet31 31
+Ethernet32 32
+Ethernet33 33
+Ethernet34 34
+Ethernet35 35
+Ethernet36 36
+Ethernet37 37
+Ethernet38 38
+Ethernet39 39
+Ethernet40 40
+Ethernet41 41
+Ethernet42 42
+Ethernet43 43
+Ethernet44 44
+Ethernet45 45
+Ethernet46 46
+Ethernet47 47
+Ethernet48 48
+Ethernet49 49
+Ethernet50 50
+Ethernet51 51
+Ethernet52 52
+Ethernet53 53
diff --git a/device/marvell/x86_64-marvell_slm5401_54x-r0/SLM5401-54x/sai.profile b/device/marvell/x86_64-marvell_slm5401_54x-r0/SLM5401-54x/sai.profile
new file mode 100644
index 000000000000..edba72ba4823
--- /dev/null
+++ b/device/marvell/x86_64-marvell_slm5401_54x-r0/SLM5401-54x/sai.profile
@@ -0,0 +1,2 @@
+mode=1
+hwId=slm5401-54x
diff --git a/device/marvell/x86_64-marvell_slm5401_54x-r0/installer.conf b/device/marvell/x86_64-marvell_slm5401_54x-r0/installer.conf
new file mode 100644
index 000000000000..14404194ef53
--- /dev/null
+++ b/device/marvell/x86_64-marvell_slm5401_54x-r0/installer.conf
@@ -0,0 +1,3 @@
+CONSOLE_PORT=0x2f8
+CONSOLE_DEV=1
+CONSOLE_SPEED=115200
diff --git a/device/marvell/x86_64-marvell_slm5401_54x-r0/minigraph.xml b/device/marvell/x86_64-marvell_slm5401_54x-r0/minigraph.xml
new file mode 100644
index 000000000000..3fc83ef7fc61
--- /dev/null
+++ b/device/marvell/x86_64-marvell_slm5401_54x-r0/minigraph.xml
@@ -0,0 +1,1074 @@
+
+
+
+
+
+ ARISTA01T0
+ 10.0.0.33
+ switch1
+ 10.0.0.32
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.0
+ ARISTA01T2
+ 10.0.0.1
+ 1
+ 180
+ 60
+
+
+ ARISTA02T0
+ 10.0.0.35
+ switch1
+ 10.0.0.34
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.2
+ ARISTA02T2
+ 10.0.0.3
+ 1
+ 180
+ 60
+
+
+ ARISTA03T0
+ 10.0.0.37
+ switch1
+ 10.0.0.36
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.4
+ ARISTA03T2
+ 10.0.0.5
+ 1
+ 180
+ 60
+
+
+ ARISTA04T0
+ 10.0.0.39
+ switch1
+ 10.0.0.38
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.6
+ ARISTA04T2
+ 10.0.0.7
+ 1
+ 180
+ 60
+
+
+ ARISTA05T0
+ 10.0.0.41
+ switch1
+ 10.0.0.40
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.8
+ ARISTA05T2
+ 10.0.0.9
+ 1
+ 180
+ 60
+
+
+ ARISTA06T0
+ 10.0.0.43
+ switch1
+ 10.0.0.42
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.10
+ ARISTA06T2
+ 10.0.0.11
+ 1
+ 180
+ 60
+
+
+ ARISTA07T0
+ 10.0.0.45
+ switch1
+ 10.0.0.44
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.12
+ ARISTA07T2
+ 10.0.0.13
+ 1
+ 180
+ 60
+
+
+ ARISTA08T0
+ 10.0.0.47
+ switch1
+ 10.0.0.46
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.14
+ ARISTA08T2
+ 10.0.0.15
+ 1
+ 180
+ 60
+
+
+ ARISTA09T0
+ 10.0.0.49
+ switch1
+ 10.0.0.48
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.16
+ ARISTA09T2
+ 10.0.0.17
+ 1
+ 180
+ 60
+
+
+ ARISTA10T0
+ 10.0.0.51
+ switch1
+ 10.0.0.50
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.18
+ ARISTA10T2
+ 10.0.0.19
+ 1
+ 180
+ 60
+
+
+ ARISTA11T0
+ 10.0.0.53
+ switch1
+ 10.0.0.52
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.20
+ ARISTA11T2
+ 10.0.0.21
+ 1
+ 180
+ 60
+
+
+ ARISTA12T0
+ 10.0.0.55
+ switch1
+ 10.0.0.54
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.22
+ ARISTA12T2
+ 10.0.0.23
+ 1
+ 180
+ 60
+
+
+ ARISTA13T0
+ 10.0.0.57
+ switch1
+ 10.0.0.56
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.24
+ ARISTA13T2
+ 10.0.0.25
+ 1
+ 180
+ 60
+
+
+ ARISTA14T0
+ 10.0.0.59
+ switch1
+ 10.0.0.58
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.26
+ ARISTA14T2
+ 10.0.0.27
+ 1
+ 180
+ 60
+
+
+ ARISTA15T0
+ 10.0.0.61
+ switch1
+ 10.0.0.60
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.28
+ ARISTA15T2
+ 10.0.0.29
+ 1
+ 180
+ 60
+
+
+ ARISTA16T0
+ 10.0.0.63
+ switch1
+ 10.0.0.62
+ 1
+ 180
+ 60
+
+
+ switch1
+ 10.0.0.30
+ ARISTA16T2
+ 10.0.0.31
+ 1
+ 180
+ 60
+
+
+
+
+ 65100
+ switch1
+
+
+ 10.0.0.33
+
+
+
+
+ 10.0.0.1
+
+
+
+
+ 10.0.0.35
+
+
+
+
+ 10.0.0.3
+
+
+
+
+ 10.0.0.37
+
+
+
+
+ 10.0.0.5
+
+
+
+
+ 10.0.0.39
+
+
+
+
+ 10.0.0.7
+
+
+
+
+ 10.0.0.41
+
+
+
+
+ 10.0.0.9
+
+
+
+
+ 10.0.0.43
+
+
+
+
+ 10.0.0.11
+
+
+
+
+ 10.0.0.45
+
+
+
+
+ 10.0.0.13
+
+
+
+
+ 10.0.0.47
+
+
+
+
+ 10.0.0.15
+
+
+
+
+ 10.0.0.49
+
+
+
+
+ 10.0.0.17
+
+
+
+
+ 10.0.0.51
+
+
+
+
+ 10.0.0.19
+
+
+
+
+ 10.0.0.53
+
+
+
+
+ 10.0.0.21
+
+
+
+
+ 10.0.0.55
+
+
+
+
+ 10.0.0.23
+
+
+
+
+ 10.0.0.57
+
+
+
+
+ 10.0.0.25
+
+
+
+
+ 10.0.0.59
+
+
+
+
+ 10.0.0.27
+
+
+
+
+ 10.0.0.61
+
+
+
+
+ 10.0.0.29
+
+
+
+
+ 10.0.0.63
+
+
+
+
+ 10.0.0.31
+
+
+
+
+
+
+
+ 64001
+ ARISTA01T0
+
+
+
+ 65200
+ ARISTA01T2
+
+
+
+ 64002
+ ARISTA02T0
+
+
+
+ 65200
+ ARISTA02T2
+
+
+
+ 64003
+ ARISTA03T0
+
+
+
+ 65200
+ ARISTA03T2
+
+
+
+ 64004
+ ARISTA04T0
+
+
+
+ 65200
+ ARISTA04T2
+
+
+
+ 64005
+ ARISTA05T0
+
+
+
+ 65200
+ ARISTA05T2
+
+
+
+ 64006
+ ARISTA06T0
+
+
+
+ 65200
+ ARISTA06T2
+
+
+
+ 64007
+ ARISTA07T0
+
+
+
+ 65200
+ ARISTA07T2
+
+
+
+ 64008
+ ARISTA08T0
+
+
+
+ 65200
+ ARISTA08T2
+
+
+
+ 64009
+ ARISTA09T0
+
+
+
+ 65200
+ ARISTA09T2
+
+
+
+ 64010
+ ARISTA10T0
+
+
+
+ 65200
+ ARISTA10T2
+
+
+
+ 64011
+ ARISTA11T0
+
+
+
+ 65200
+ ARISTA11T2
+
+
+
+ 64012
+ ARISTA12T0
+
+
+
+ 65200
+ ARISTA12T2
+
+
+
+ 64013
+ ARISTA13T0
+
+
+
+ 65200
+ ARISTA13T2
+
+
+
+ 64014
+ ARISTA14T0
+
+
+
+ 65200
+ ARISTA14T2
+
+
+
+ 64015
+ ARISTA15T0
+
+
+
+ 65200
+ ARISTA15T2
+
+
+
+ 64016
+ ARISTA16T0
+
+
+
+ 65200
+ ARISTA16T2
+
+
+
+
+
+
+
+
+
+ HostIP
+ Loopback0
+
+ 10.1.0.32/32
+
+ 10.1.0.32/32
+
+
+
+
+
+
+
+ switch1
+
+
+
+
+
+ Ethernet0
+ 10.0.0.0/31
+
+
+
+ Ethernet4
+ 10.0.0.2/31
+
+
+
+ Ethernet8
+ 10.0.0.4/31
+
+
+
+ Ethernet12
+ 10.0.0.6/31
+
+
+
+ Ethernet16
+ 10.0.0.8/31
+
+
+
+ Ethernet20
+ 10.0.0.10/31
+
+
+
+ Ethernet24
+ 10.0.0.12/31
+
+
+
+ Ethernet28
+ 10.0.0.14/31
+
+
+
+ Ethernet32
+ 10.0.0.16/31
+
+
+
+ Ethernet36
+ 10.0.0.18/31
+
+
+
+ Ethernet40
+ 10.0.0.20/31
+
+
+
+ Ethernet44
+ 10.0.0.22/31
+
+
+
+ Ethernet48
+ 10.0.0.24/31
+
+
+
+ Ethernet52
+ 10.0.0.26/31
+
+
+
+ Ethernet56
+ 10.0.0.28/31
+
+
+
+ Ethernet60
+ 10.0.0.30/31
+
+
+
+ Ethernet64
+ 10.0.0.32/31
+
+
+
+ Ethernet68
+ 10.0.0.34/31
+
+
+
+ Ethernet72
+ 10.0.0.36/31
+
+
+
+ Ethernet76
+ 10.0.0.38/31
+
+
+
+ Ethernet80
+ 10.0.0.40/31
+
+
+
+ Ethernet84
+ 10.0.0.42/31
+
+
+
+ Ethernet88
+ 10.0.0.44/31
+
+
+
+ Ethernet92
+ 10.0.0.46/31
+
+
+
+ Ethernet96
+ 10.0.0.48/31
+
+
+
+ Ethernet100
+ 10.0.0.50/31
+
+
+
+ Ethernet104
+ 10.0.0.52/31
+
+
+
+ Ethernet108
+ 10.0.0.54/31
+
+
+
+ Ethernet112
+ 10.0.0.56/31
+
+
+
+ Ethernet116
+ 10.0.0.58/31
+
+
+
+ Ethernet120
+ 10.0.0.60/31
+
+
+
+ Ethernet124
+ 10.0.0.62/31
+
+
+
+
+
+
+
+
+
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet0
+ ARISTA01T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet4
+ ARISTA02T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet8
+ ARISTA03T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet12
+ ARISTA04T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet16
+ ARISTA05T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet20
+ ARISTA06T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet24
+ ARISTA07T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet28
+ ARISTA08T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet32
+ ARISTA09T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet36
+ ARISTA10T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet40
+ ARISTA11T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet44
+ ARISTA12T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet48
+ ARISTA13T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet52
+ ARISTA14T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet56
+ ARISTA15T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet60
+ ARISTA16T2
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet64
+ ARISTA01T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet68
+ ARISTA02T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet72
+ ARISTA03T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet76
+ ARISTA04T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet80
+ ARISTA05T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet84
+ ARISTA06T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet88
+ ARISTA07T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet92
+ ARISTA08T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet96
+ ARISTA09T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet100
+ ARISTA10T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet104
+ ARISTA11T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet108
+ ARISTA12T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet112
+ ARISTA13T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet116
+ ARISTA14T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet120
+ ARISTA15T0
+ Ethernet1
+
+
+ DeviceInterfaceLink
+ switch1
+ Ethernet124
+ ARISTA16T0
+ Ethernet1
+
+
+
+
+ switch1
+ SLM5401-54x
+
+
+
+
+
+
+ switch1
+
+
+ DhcpResources
+
+
+
+
+ NtpResources
+
+ 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org
+
+
+ SyslogResources
+
+
+
+
+
+
+
+
+ switch1
+ SLM5401-54x
+
diff --git a/device/marvell/x86_64-marvell_slm5401_54x-r0/plugins/eeprom.py b/device/marvell/x86_64-marvell_slm5401_54x-r0/plugins/eeprom.py
new file mode 100644
index 000000000000..7681caafeef4
--- /dev/null
+++ b/device/marvell/x86_64-marvell_slm5401_54x-r0/plugins/eeprom.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+try:
+ import exceptions
+ import binascii
+ import time
+ import optparse
+ import warnings
+ import os
+ import sys
+ from sonic_eeprom import eeprom_base
+ from sonic_eeprom import eeprom_tlvinfo
+ import subprocess
+except ImportError, 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/1-0057/eeprom"
+ #Two i2c buses might get flipped order, check them both.
+ if not os.path.exists(self.eeprom_path):
+ self.eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom"
+ super(board, self).__init__(self.eeprom_path, 0, '', True)
diff --git a/device/marvell/x86_64-marvell_slm5401_54x-r0/plugins/sfputil.py b/device/marvell/x86_64-marvell_slm5401_54x-r0/plugins/sfputil.py
new file mode 100644
index 000000000000..6dc35d72bb21
--- /dev/null
+++ b/device/marvell/x86_64-marvell_slm5401_54x-r0/plugins/sfputil.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+
+try:
+ from sonic_sfp.sfputilbase import sfputilbase
+except ImportError, e:
+ raise ImportError (str(e) + "- required module not found")
+
+
+class sfputil(sfputilbase):
+ """Platform specific sfputil class"""
+
+ port_start = 0
+ port_end = 31
+ ports_in_block = 32
+
+ port_to_eeprom_mapping = {}
+ port_to_i2c_mapping = {
+ 9 : 18,
+ 10 : 19,
+ 11 : 20,
+ 12 : 21,
+ 1 : 22,
+ 2 : 23,
+ 3 : 24,
+ 4 : 25,
+ 6 : 26,
+ 5 : 27,
+ 8 : 28,
+ 7 : 29,
+ 13 : 30,
+ 14 : 31,
+ 15 : 32,
+ 16 : 33,
+ 17 : 34,
+ 18 : 35,
+ 19 : 36,
+ 20 : 37,
+ 25 : 38,
+ 26 : 39,
+ 27 : 40,
+ 28 : 41,
+ 29 : 42,
+ 30 : 43,
+ 31 : 44,
+ 32 : 45,
+ 21 : 46,
+ 22 : 47,
+ 23 : 48,
+ 24 : 49,
+ }
+
+ _qsfp_ports = range(0, ports_in_block + 1)
+
+ def __init__(self, port_num):
+ # Override port_to_eeprom_mapping for class initialization
+ eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom'
+ for x in range(self.port_start, self.port_end + 1):
+ port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1])
+ self.port_to_eeprom_mapping[x] = port_eeprom_path
+ sfputilbase.__init__(self, port_num)
diff --git a/dockers/docker-orchagent-nephos b/dockers/docker-orchagent-nephos
new file mode 120000
index 000000000000..8d52609c56e5
--- /dev/null
+++ b/dockers/docker-orchagent-nephos
@@ -0,0 +1 @@
+docker-orchagent
\ No newline at end of file
diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh
index f92dfe5fd543..027c6d52a2fe 100755
--- a/dockers/docker-orchagent/orchagent.sh
+++ b/dockers/docker-orchagent/orchagent.sh
@@ -18,6 +18,8 @@ if [ "$platform" == "broadcom" ]; then
ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
elif [ "$platform" == "cavium" ]; then
ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
+elif [ "$platform" == "nephos" ]; then
+ ORCHAGENT_ARGS+="-m $MAC_ADDRESS"
fi
exec /usr/bin/orchagent ${ORCHAGENT_ARGS}
diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2
index ad52f395d0cf..b18321676b78 100644
--- a/files/build_templates/swss.service.j2
+++ b/files/build_templates/swss.service.j2
@@ -3,11 +3,15 @@ Description=switch state service
Requires=database.service
{% if sonic_asic_platform == 'broadcom' %}
Requires=opennsl-modules-3.16.0-4-amd64.service
+{% elif sonic_asic_platform == 'nephos' %}
+Requires=nps-modules-3.16.0-4-amd64.service
{% endif %}
After=database.service
After=interfaces-config.service
{% if sonic_asic_platform == 'broadcom' %}
After=opennsl-modules-3.16.0-4-amd64.service
+{% elif sonic_asic_platform == 'nephos' %}
+After=nps-modules-3.16.0-4-amd64.service
{% endif %}
[Service]
diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk
index 4f806ebd97f1..46bde157cf11 100644
--- a/platform/broadcom/sai.mk
+++ b/platform/broadcom/sai.mk
@@ -1,9 +1,9 @@
-BRCM_SAI = libsaibcm_3.0.3.3-1_amd64.deb
-$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.3-1_amd64.deb?sv=2015-04-05&sr=b&sig=hoUotiQsgVMo6%2BzH87aaIeTsqPsRYWQT5oRdSc1uEm8%3D&se=2154-11-09T08%3A09%3A33Z&sp=r"
+BRCM_SAI = libsaibcm_3.0.3.3-3_amd64.deb
+$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.3-3_amd64.deb?sv=2015-04-05&sr=b&sig=A%2Bcq%2B8XL%2BZfhOV6zqwRWm1jQ31PN0t54H9abZSRwTVw%3D&se=2031-09-25T22%3A41%3A43Z&sp=r"
-BRCM_SAI_DEV = libsaibcm-dev_3.0.3.3-1_amd64.deb
+BRCM_SAI_DEV = libsaibcm-dev_3.0.3.3-3_amd64.deb
$(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV)))
-$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.3-1_amd64.deb?sv=2015-04-05&sr=b&sig=LfvM2LkGj3dPnSCyVEgPA35jvjKOgq%2FNSvj2UiPeGm4%3D&se=2154-11-09T08%3A11%3A03Z&sp=r"
+$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.3-3_amd64.deb?sv=2015-04-05&sr=b&sig=XT0v%2B25LZ5whTwH%2FE%2FykQLV8Kzn%2FoDyLNXjmqNuiFPo%3D&se=2031-09-25T22%3A41%3A21Z&sp=r"
SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV)
$(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI)
diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys
index 1d9ccb21aaf8..f2dc0aa6b96a 160000
--- a/platform/broadcom/sonic-platform-modules-ingrasys
+++ b/platform/broadcom/sonic-platform-modules-ingrasys
@@ -1 +1 @@
-Subproject commit 1d9ccb21aaf868a788fd593ff1c03fdaf150eaf0
+Subproject commit f2dc0aa6b96ab293b4ae6ebf3a942851dd9324b7
diff --git a/platform/centec/libsaithrift-dev.mk b/platform/centec/libsaithrift-dev.mk
index b8fddbdf7731..083f4a25c92b 100644
--- a/platform/centec/libsaithrift-dev.mk
+++ b/platform/centec/libsaithrift-dev.mk
@@ -4,4 +4,4 @@ LIBSAITHRIFT_DEV_CENTEC = libsaithrift-dev_0.9.4_amd64.deb
$(LIBSAITHRIFT_DEV_CENTEC)_SRC_PATH = $(SRC_PATH)/SAI
$(LIBSAITHRIFT_DEV_CENTEC)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(CENTEC_SAI)
$(LIBSAITHRIFT_DEV_CENTEC)_RDEPENDS += $(LIBTHRIFT) $(CENTEC_SAI)
-SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_CENTEC)
+#SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_CENTEC)
diff --git a/platform/centec/rules.mk b/platform/centec/rules.mk
index 8b676f87ece4..62070a92a3b6 100644
--- a/platform/centec/rules.mk
+++ b/platform/centec/rules.mk
@@ -8,12 +8,10 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk
include $(PLATFORM_PATH)/python-saithrift.mk
include $(PLATFORM_PATH)/docker-ptf-centec.mk
-SONIC_ALL += $(SONIC_ONE_IMAGE) \
- $(DOCKER_PTF_CENTEC) \
- $(DOCKER_SYNCD_CENTEC_RPC)
+SONIC_ALL += $(SONIC_ONE_IMAGE)
# Inject centec sai into sairedis
-$(LIBSAIREDIS)_DEPENDS += $(CENTEC_SAI) $(LIBSAITHRIFT_DEV_CENTEC)
+$(LIBSAIREDIS)_DEPENDS += $(CENTEC_SAI) #$(LIBSAITHRIFT_DEV_CENTEC)
# Runtime dependency on centec sai is set only for syncd
$(SYNCD)_RDEPENDS += $(CENTEC_SAI)
diff --git a/platform/centec/sai.mk b/platform/centec/sai.mk
index de8615ac132c..299b36a69ebf 100644
--- a/platform/centec/sai.mk
+++ b/platform/centec/sai.mk
@@ -1,5 +1,5 @@
# Centec SAI
CENTEC_SAI = libsai_1.0.0_amd64.deb
-$(CENTEC_SAI)_URL = https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/SONiC_0.9.4/libsai_1.0.0_amd64.deb
+$(CENTEC_SAI)_URL = https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/SONiC_1.0/libsai_1.0.0_amd64.deb
SONIC_ONLINE_DEBS += $(CENTEC_SAI)
diff --git a/platform/centec/sdk.mk b/platform/centec/sdk.mk
index ac1939122f47..e3ce05f6b742 100644
--- a/platform/centec/sdk.mk
+++ b/platform/centec/sdk.mk
@@ -1,4 +1,4 @@
CENTEC_SDK_KERNEL = centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb
-$(CENTEC_SDK_KERNEL)_URL = "https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb"
+$(CENTEC_SDK_KERNEL)_URL = "https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/SONiC_1.0/centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb"
SONIC_ONLINE_DEBS += $(CENTEC_SDK_KERNEL)
diff --git a/platform/marvell/libsaithrift-dev.mk b/platform/marvell/libsaithrift-dev.mk
index 443406e9c2fb..e056a056437e 100644
--- a/platform/marvell/libsaithrift-dev.mk
+++ b/platform/marvell/libsaithrift-dev.mk
@@ -1,7 +1,7 @@
# libsaithrift-dev package
LIBSAITHRIFT_DEV_MRVL = libsaithrift-dev_0.9.4_amd64.deb
-$(LIBSAITHRIFT_DEV_MRVL)_SRC_PATH = $(SRC_PATH)/SAI
+$(LIBSAITHRIFT_DEV_MRVL)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI
$(LIBSAITHRIFT_DEV_MRVL)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(MRVL_FPA) $(MRVL_SAI)
$(LIBSAITHRIFT_DEV_MRVL)_RDEPENDS += $(LIBTHRIFT) $(MRVL_SAI)
SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_MRVL)
diff --git a/platform/marvell/rules.mk b/platform/marvell/rules.mk
index c5df6bab194e..185b7b5fd7a9 100644
--- a/platform/marvell/rules.mk
+++ b/platform/marvell/rules.mk
@@ -12,7 +12,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) \
$(DOCKER_SYNCD_MRVL_RPC)
# Inject mrvl sai into sairedis
-$(LIBSAIREDIS)_DEPENDS += $(MRVL_FPA) $(MRVL_SAI) $(LIBSAITHRIFT_DEV_MRVL)
+$(LIBSAIREDIS)_DEPENDS += $(MRVL_FPA) $(MRVL_SAI) #$(LIBSAITHRIFT_DEV_MRVL)
# Runtime dependency on mrvl sai is set only for syncd
$(SYNCD)_RDEPENDS += $(MRVL_SAI)
diff --git a/platform/marvell/sai.mk b/platform/marvell/sai.mk
index a620e2f68761..d2722971f1dd 100644
--- a/platform/marvell/sai.mk
+++ b/platform/marvell/sai.mk
@@ -1,7 +1,7 @@
# Marvell SAI
export MRVL_SAI_VERSION = 1.0.1
-export MRVL_SAI_TAG = SONiC.201705
+export MRVL_SAI_TAG = SONiC.201712
export MRVL_SAI = mrvllibsai_$(MRVL_SAI_VERSION).deb
$(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai
diff --git a/platform/marvell/sdk.mk b/platform/marvell/sdk.mk
index d5e31b995141..12050df5d34b 100644
--- a/platform/marvell/sdk.mk
+++ b/platform/marvell/sdk.mk
@@ -1,7 +1,7 @@
# Marvell FPA
export MRVL_FPA_VERSION = 1.0.1
-export MRVL_FPA_TAG = SONiC.201705
+export MRVL_FPA_TAG = SONiC.201712
export MRVL_FPA = mrvllibfpa_$(MRVL_FPA_VERSION).deb
$(MRVL_FPA)_SRC_PATH = $(PLATFORM_PATH)/sdk
diff --git a/platform/nephos/docker-orchagent-nephos.mk b/platform/nephos/docker-orchagent-nephos.mk
new file mode 100644
index 000000000000..b21e69d6cf87
--- /dev/null
+++ b/platform/nephos/docker-orchagent-nephos.mk
@@ -0,0 +1,19 @@
+# docker image for orchagent
+
+DOCKER_ORCHAGENT_NEPHOS = docker-orchagent-nephos.gz
+$(DOCKER_ORCHAGENT_NEPHOS)_PATH = $(DOCKERS_PATH)/docker-orchagent
+$(DOCKER_ORCHAGENT_NEPHOS)_DEPENDS += $(SWSS) $(REDIS_TOOLS)
+$(DOCKER_ORCHAGENT_NEPHOS)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE)
+SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_NEPHOS)
+SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_NEPHOS)
+
+$(DOCKER_ORCHAGENT_NEPHOS)_CONTAINER_NAME = swss
+$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += --net=host --privileged -t
+$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro
+$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro
+$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro
+$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro
+$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw
+
+$(DOCKER_ORCHAGENT_NEPHOS)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel
+$(DOCKER_ORCHAGENT_NEPHOS)_FILES += $(ARP_UPDATE_SCRIPT)
diff --git a/platform/nephos/docker-ptf-nephos.mk b/platform/nephos/docker-ptf-nephos.mk
new file mode 100644
index 000000000000..6d7950f7516d
--- /dev/null
+++ b/platform/nephos/docker-ptf-nephos.mk
@@ -0,0 +1,7 @@
+# docker image for docker-ptf-nephos
+
+DOCKER_PTF_NEPHOS = docker-ptf-nephos.gz
+$(DOCKER_PTF_NEPHOS)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift
+$(DOCKER_PTF_NEPHOS)_DEPENDS += $(PYTHON_SAITHRIFT_NEPHOS)
+$(DOCKER_PTF_NEPHOS)_LOAD_DOCKERS += $(DOCKER_PTF)
+#SONIC_DOCKER_IMAGES += $(DOCKER_PTF_NEPHOS)
diff --git a/platform/nephos/docker-syncd-nephos-rpc.mk b/platform/nephos/docker-syncd-nephos-rpc.mk
new file mode 100644
index 000000000000..e891d0b1a68d
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos-rpc.mk
@@ -0,0 +1,17 @@
+# docker image for nephos syncd with rpc
+
+DOCKER_SYNCD_NEPHOS_RPC = docker-syncd-nephos-rpc.gz
+$(DOCKER_SYNCD_NEPHOS_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-nephos-rpc
+$(DOCKER_SYNCD_NEPHOS_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT)
+$(DOCKER_SYNCD_NEPHOS_RPC)_FILES += $(DSSERVE) $(NPX_DIAG)
+$(DOCKER_SYNCD_NEPHOS_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_NEPHOS)
+SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS_RPC)
+ifeq ($(ENABLE_SYNCD_RPC),y)
+SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS_RPC)
+endif
+
+$(DOCKER_SYNCD_NEPHOS_RPC)_CONTAINER_NAME = syncd
+$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += --net=host --privileged -t
+$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf
+$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd
+$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro
diff --git a/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 b/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2
new file mode 100644
index 000000000000..9a01d4e1e001
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2
@@ -0,0 +1,51 @@
+FROM docker-syncd-nephos
+
+## Make apt-get non-interactive
+ENV DEBIAN_FRONTEND=noninteractive
+
+COPY \
+{% for deb in docker_syncd_nephos_rpc_debs.split(' ') -%}
+debs/{{ deb }}{{' '}}
+{%- endfor -%}
+debs/
+
+RUN dpkg -P syncd
+
+RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \
+{% for deb in docker_syncd_nephos_rpc_debs.split(' ') -%}
+dpkg_apt debs/{{ deb }}{{'; '}}
+{%- endfor %}
+
+## Pre-install the fundamental packages
+RUN apt-get update \
+ && apt-get -y install \
+ net-tools \
+ python-pip \
+ build-essential \
+ libssl-dev \
+ libffi-dev \
+ python-dev \
+ wget \
+ cmake \
+ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \
+ && tar xvfz 1.0.0.tar.gz \
+ && cd nanomsg-1.0.0 \
+ && mkdir -p build \
+ && cmake . \
+ && make install \
+ && ldconfig \
+ && cd .. \
+ && rm -fr nanomsg-1.0.0 \
+ && rm -f 1.0.0.tar.gz \
+ && pip install cffi==1.7.0 \
+ && pip install --upgrade cffi==1.7.0 \
+ && pip install nnpy \
+ && mkdir -p /opt \
+ && cd /opt \
+ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \
+ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \
+ && rm -rf /root/deps
+
+COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
+
+ENTRYPOINT ["/usr/bin/supervisord"]
diff --git a/platform/nephos/docker-syncd-nephos-rpc/ptf_nn_agent.conf b/platform/nephos/docker-syncd-nephos-rpc/ptf_nn_agent.conf
new file mode 100644
index 000000000000..fa1ed0eb1622
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos-rpc/ptf_nn_agent.conf
@@ -0,0 +1,10 @@
+[program:ptf_nn_agent]
+command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400
+process_name=ptf_nn_agent
+stdout_logfile=/tmp/ptf_nn_agent.out.log
+stderr_logfile=/tmp/ptf_nn_agent.err.log
+redirect_stderr=false
+autostart=true
+autorestart=true
+startsecs=1
+numprocs=1
diff --git a/platform/nephos/docker-syncd-nephos.mk b/platform/nephos/docker-syncd-nephos.mk
new file mode 100644
index 000000000000..a79c8524b890
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos.mk
@@ -0,0 +1,19 @@
+# docker image for nephos syncd
+
+DOCKER_SYNCD_NEPHOS = docker-syncd-nephos.gz
+$(DOCKER_SYNCD_NEPHOS)_PATH = $(PLATFORM_PATH)/docker-syncd-nephos
+$(DOCKER_SYNCD_NEPHOS)_DEPENDS += $(SYNCD)
+$(DOCKER_SYNCD_NEPHOS)_FILES += $(DSSERVE) $(NPX_DIAG)
+$(DOCKER_SYNCD_NEPHOS)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE)
+SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS)
+ifneq ($(ENABLE_SYNCD_RPC),y)
+SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS)
+endif
+
+$(DOCKER_SYNCD_NEPHOS)_CONTAINER_NAME = syncd
+$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += --net=host --privileged -t
+$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf
+$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd
+$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro
+
+$(DOCKER_SYNCD_NEPHOS)_BASE_IMAGE_FILES += npx_diag:/usr/bin/npx_diag
diff --git a/platform/nephos/docker-syncd-nephos/Dockerfile.j2 b/platform/nephos/docker-syncd-nephos/Dockerfile.j2
new file mode 100755
index 000000000000..e0248d460a12
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos/Dockerfile.j2
@@ -0,0 +1,31 @@
+FROM docker-config-engine
+
+## Make apt-get non-interactive
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update
+
+COPY \
+{% for deb in docker_syncd_nephos_debs.split(' ') -%}
+debs/{{ deb }}{{' '}}
+{%- endfor -%}
+debs/
+
+RUN dpkg -i \
+{% for deb in docker_syncd_nephos_debs.split(' ') -%}
+debs/{{ deb }}{{' '}}
+{%- endfor %}
+
+## TODO: add kmod into Depends
+RUN apt-get install -f kmod
+
+COPY ["files/dsserve", "files/npx_diag", "start.sh", "/usr/bin/"]
+RUN chmod +x /usr/bin/dsserve /usr/bin/npx_diag
+
+COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
+
+## Clean up
+RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
+RUN rm -rf /debs
+
+ENTRYPOINT ["/usr/bin/supervisord"]
diff --git a/platform/nephos/docker-syncd-nephos/base_image_files/npx_diag b/platform/nephos/docker-syncd-nephos/base_image_files/npx_diag
new file mode 100755
index 000000000000..876bc1816ecc
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos/base_image_files/npx_diag
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+docker exec -i syncd npx_diag "$@"
diff --git a/platform/nephos/docker-syncd-nephos/start.sh b/platform/nephos/docker-syncd-nephos/start.sh
new file mode 100755
index 000000000000..623316050475
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos/start.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+rm -f /var/run/rsyslogd.pid
+
+supervisorctl start rsyslogd
+
+supervisorctl start syncd
diff --git a/platform/nephos/docker-syncd-nephos/supervisord.conf b/platform/nephos/docker-syncd-nephos/supervisord.conf
new file mode 100644
index 000000000000..1af5d70a1d0c
--- /dev/null
+++ b/platform/nephos/docker-syncd-nephos/supervisord.conf
@@ -0,0 +1,28 @@
+[supervisord]
+logfile_maxbytes=1MB
+logfile_backups=2
+nodaemon=true
+
+[program:start.sh]
+command=/usr/bin/start.sh
+priority=1
+autostart=true
+autorestart=false
+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:syncd]
+command=/usr/bin/syncd_start.sh
+priority=3
+autostart=false
+autorestart=false
+stdout_logfile=syslog
+stderr_logfile=syslog
diff --git a/platform/nephos/libsaithrift-dev.mk b/platform/nephos/libsaithrift-dev.mk
new file mode 100644
index 000000000000..4103d5c0c7b0
--- /dev/null
+++ b/platform/nephos/libsaithrift-dev.mk
@@ -0,0 +1,7 @@
+# libsaithrift-dev package
+
+LIBSAITHRIFT_DEV_NEPHOS = libsaithrift-dev_0.9.4_amd64.deb
+$(LIBSAITHRIFT_DEV_NEPHOS)_SRC_PATH = $(SRC_PATH)/SAI
+$(LIBSAITHRIFT_DEV_NEPHOS)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(NEPHOS_SAI) $(NEPHOS_SAI_DEV)
+$(LIBSAITHRIFT_DEV_NEPHOS)_RDEPENDS += $(LIBTHRIFT) $(NEPHOS_SAI)
+#SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_NEPHOS)
diff --git a/platform/nephos/one-image.mk b/platform/nephos/one-image.mk
new file mode 100644
index 000000000000..8e9406dca89c
--- /dev/null
+++ b/platform/nephos/one-image.mk
@@ -0,0 +1,10 @@
+# sonic nephos one image installer
+
+SONIC_ONE_IMAGE = sonic-nephos.bin
+$(SONIC_ONE_IMAGE)_MACHINE = nephos
+$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie
+$(SONIC_ONE_IMAGE)_INSTALLS += $(NEPHOS_NPS_KERNEL)
+$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9130_32X_PLATFORM_MODULE) \
+ $(INGRASYS_S9230_64X_PLATFORM_MODULE)
+$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES)
+SONIC_INSTALLERS += $(SONIC_ONE_IMAGE)
diff --git a/platform/nephos/platform-modules-ingrasys.mk b/platform/nephos/platform-modules-ingrasys.mk
new file mode 100644
index 000000000000..dde33e0b8745
--- /dev/null
+++ b/platform/nephos/platform-modules-ingrasys.mk
@@ -0,0 +1,18 @@
+# Ingrasys S9130-32X and S9230-64X Platform modules
+
+INGRASYS_S9130_32X_PLATFORM_MODULE_VERSION = 1.0.0
+INGRASYS_S9230_64X_PLATFORM_MODULE_VERSION = 1.0.0
+
+export INGRASYS_S9130_32X_PLATFORM_MODULE_VERSION
+export INGRASYS_S9230_64X_PLATFORM_MODULE_VERSION
+
+INGRASYS_S9130_32X_PLATFORM_MODULE = sonic-platform-ingrasys-s9130-32x_$(INGRASYS_S9130_32X_PLATFORM_MODULE_VERSION)_amd64.deb
+$(INGRASYS_S9130_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys
+$(INGRASYS_S9130_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON)
+$(INGRASYS_S9130_32X_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9130_32x-r0
+SONIC_DPKG_DEBS += $(INGRASYS_S9130_32X_PLATFORM_MODULE)
+
+INGRASYS_S9230_64X_PLATFORM_MODULE = sonic-platform-ingrasys-s9230-64x_$(INGRASYS_S9230_64X_PLATFORM_MODULE_VERSION)_amd64.deb
+$(INGRASYS_S9230_64X_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9230_64x-r0
+
+$(eval $(call add_extra_package,$(INGRASYS_S9130_32X_PLATFORM_MODULE),$(INGRASYS_S9230_64X_PLATFORM_MODULE)))
diff --git a/platform/nephos/platform.conf b/platform/nephos/platform.conf
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/platform/nephos/python-saithrift.mk b/platform/nephos/python-saithrift.mk
new file mode 100644
index 000000000000..bc4a57b64cd3
--- /dev/null
+++ b/platform/nephos/python-saithrift.mk
@@ -0,0 +1,6 @@
+# python-saithrift package
+
+PYTHON_SAITHRIFT_NEPHOS = python-saithrift_0.9.4_amd64.deb
+$(PYTHON_SAITHRIFT_NEPHOS)_SRC_PATH = $(SRC_PATH)/SAI
+$(PYTHON_SAITHRIFT_NEPHOS)_DEPENDS += $(NEPHOS_SAI_DEV) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV)
+#SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_NEPHOS)
diff --git a/platform/nephos/rules.mk b/platform/nephos/rules.mk
new file mode 100644
index 000000000000..fc6200005db5
--- /dev/null
+++ b/platform/nephos/rules.mk
@@ -0,0 +1,26 @@
+include $(PLATFORM_PATH)/sdk.mk
+include $(PLATFORM_PATH)/sai.mk
+include $(PLATFORM_PATH)/platform-modules-ingrasys.mk
+include $(PLATFORM_PATH)/docker-orchagent-nephos.mk
+include $(PLATFORM_PATH)/docker-syncd-nephos.mk
+include $(PLATFORM_PATH)/docker-syncd-nephos-rpc.mk
+include $(PLATFORM_PATH)/one-image.mk
+include $(PLATFORM_PATH)/libsaithrift-dev.mk
+include $(PLATFORM_PATH)/python-saithrift.mk
+#include $(PLATFORM_PATH)/docker-ptf-nephos.mk
+
+NPX_DIAG = npx_diag
+$(NPX_DIAG)_URL = "https://github.com/NephosInc/SONiC/raw/master/sdk/npx_diag_2.0.1-20171020"
+
+DSSERVE = dsserve
+$(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/20170518/dsserve?sv=2015-04-05&sr=b&sig=gyNbgSL%2FvpMXDdpboVkIJcTKMRdGgEaOR9OukHhEsu8%3D&se=2030-03-31T23%3A06%3A35Z&sp=r"
+
+SONIC_ONLINE_FILES += $(NPX_DIAG) $(DSSERVE)
+
+SONIC_ALL += $(SONIC_ONE_IMAGE) $(DOCKER_FPM)
+
+# Inject nephos sai into sairedis
+$(LIBSAIREDIS)_DEPENDS += $(NEPHOS_SAI) $(NEPHOS_SAI_DEV) #$(LIBSAITHRIFT_DEV_NEPHOS)
+
+# Runtime dependency on nephos sai is set only for syncd
+$(SYNCD)_RDEPENDS += $(NEPHOS_SAI)
diff --git a/platform/nephos/sai.mk b/platform/nephos/sai.mk
new file mode 100644
index 000000000000..90ee027518e8
--- /dev/null
+++ b/platform/nephos/sai.mk
@@ -0,0 +1,9 @@
+NEPHOS_SAI = libsainps_2.0.2-20171204_amd64.deb
+$(NEPHOS_SAI)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps_2.0.2-20171204_amd64.deb"
+
+NEPHOS_SAI_DEV = libsainps-dev_2.0.2-20171124_amd64.deb
+$(eval $(call add_derived_package,$(NEPHOS_SAI),$(NEPHOS_SAI_DEV)))
+$(NEPHOS_SAI_DEV)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps-dev_2.0.2-20171124_amd64.deb"
+
+SONIC_ONLINE_DEBS += $(NEPHOS_SAI) $(NEPHOS_SAI_DEV)
+$(NEPHOS_SAI_DEV)_DEPENDS += $(NEPHOS_SAI)
diff --git a/platform/nephos/sdk.mk b/platform/nephos/sdk.mk
new file mode 100644
index 000000000000..392ae459cc57
--- /dev/null
+++ b/platform/nephos/sdk.mk
@@ -0,0 +1,4 @@
+NEPHOS_NPS_KERNEL = nps-modules-3.16.0-4-amd64_2.0.2-20171204_amd64.deb
+$(NEPHOS_NPS_KERNEL)_URL = "https://github.com/NephosInc/SONiC/raw/master/sdk/nps-modules-3.16.0-4-amd64_2.0.2-20171204_amd64.deb"
+
+SONIC_ONLINE_DEBS += $(NEPHOS_NPS_KERNEL)
diff --git a/platform/nephos/sonic-platform-modules-ingrasys b/platform/nephos/sonic-platform-modules-ingrasys
new file mode 160000
index 000000000000..b03499ed1d72
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-ingrasys
@@ -0,0 +1 @@
+Subproject commit b03499ed1d72a239ed386e40370b146c9a479eaa
diff --git a/rules/ixgbe.mk b/rules/ixgbe.mk
new file mode 100644
index 000000000000..bdd175eac869
--- /dev/null
+++ b/rules/ixgbe.mk
@@ -0,0 +1,8 @@
+# initramfs-tools package
+
+IXGBE_DRIVER_VERSION = 5.2.4
+export IXGBE_DRIVER_VERSION
+
+IXGBE_DRIVER = ixgbe.ko
+$(IXGBE_DRIVER)_SRC_PATH = $(SRC_PATH)/ixgbe
+SONIC_MAKE_DEBS += $(IXGBE_DRIVER)
diff --git a/slave.mk b/slave.mk
index 8ec6832bd687..e6764014ef32 100644
--- a/slave.mk
+++ b/slave.mk
@@ -390,6 +390,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
$(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) \
$(LINUX_KERNEL) \
$(IGB_DRIVER) \
+ $(IXGBE_DRIVER) \
$(SONIC_DEVICE_DATA) \
$(SONIC_UTILS) \
$(LIBPAM_TACPLUS) \
diff --git a/src/ixgbe/Makefile b/src/ixgbe/Makefile
new file mode 100644
index 000000000000..133fc7db0570
--- /dev/null
+++ b/src/ixgbe/Makefile
@@ -0,0 +1,22 @@
+.ONESHELL:
+SHELL = /bin/bash
+.SHELLFLAGS += -e
+
+MAIN_TARGET = ixgbe.ko
+
+$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
+ rm -rf ./ixgbe-$(IXGBE_DRIVER_VERSION)
+ wget -O ixgbe-$(IXGBE_DRIVER_VERSION).tar.gz "https://sonicstorage.blob.core.windows.net/packages/ixgbe-5.2.4.tar.gz?sv=2015-04-05&sr=b&sig=AaqJHHaPiJRp8R3HKobi0GNDgHAVnqijk6hpahwJ0Mg%3D&se=2154-10-05T22%3A19%3A29Z&sp=r"
+ tar xzf ixgbe-$(IXGBE_DRIVER_VERSION).tar.gz
+
+ # Patch
+ pushd ./ixgbe-$(IXGBE_DRIVER_VERSION)
+
+ # Build the package
+ pushd src
+ export BUILD_KERNEL=3.16.0-4-amd64
+ make
+ popd
+
+ popd
+ mv ./ixgbe-$(IXGBE_DRIVER_VERSION)/src/$* $(DEST)/
diff --git a/src/sonic-sairedis b/src/sonic-sairedis
index 345f179482db..3b817bbe14f1 160000
--- a/src/sonic-sairedis
+++ b/src/sonic-sairedis
@@ -1 +1 @@
-Subproject commit 345f179482dbf5258cad088414bc9eb230decd97
+Subproject commit 3b817bbe14f1e5177e6200c7a80ab74db4768eaa