[Ufispace][PDDF] Add PDDF support on S9180-32X (#14909)
* Add s9180-32x pddf support Signed-off-by: cytsai0409 <cytsai0409@gmail.com> * Fix memset_s parameter Signed-off-by: cytsai0409 <cytsai0409@gmail.com> * Update chassis.py and fan.py 1. remove duplicate get_sfp() in chassis.py 2. update get_direction() and get_target_speed() in fan.py Signed-off-by: cytsai0409 <cytsai0409@gmail.com> --------- Signed-off-by: cytsai0409 <cytsai0409@gmail.com>
This commit is contained in:
parent
05f9c5c297
commit
d2b5d774c5
@ -0,0 +1,35 @@
|
|||||||
|
# name lanes alias speed autoneg fec index
|
||||||
|
Ethernet0 0,1,2,3 Ethernet0 100000 off none 0
|
||||||
|
Ethernet4 4,5,6,7 Ethernet4 100000 off none 1
|
||||||
|
Ethernet8 8,9,10,11 Ethernet8 100000 off none 2
|
||||||
|
Ethernet12 12,13,14,15 Ethernet12 100000 off none 3
|
||||||
|
Ethernet16 16,17,18,19 Ethernet16 100000 off none 4
|
||||||
|
Ethernet20 20,21,22,23 Ethernet20 100000 off none 5
|
||||||
|
Ethernet24 24,25,26,27 Ethernet24 100000 off none 6
|
||||||
|
Ethernet28 28,29,30,31 Ethernet28 100000 off none 7
|
||||||
|
Ethernet32 32,33,34,35 Ethernet32 100000 off none 8
|
||||||
|
Ethernet36 36,37,38,39 Ethernet36 100000 off none 9
|
||||||
|
Ethernet40 40,41,42,43 Ethernet40 100000 off none 10
|
||||||
|
Ethernet44 44,45,46,47 Ethernet44 100000 off none 11
|
||||||
|
Ethernet48 48,49,50,51 Ethernet48 100000 off none 12
|
||||||
|
Ethernet52 52,53,54,55 Ethernet52 100000 off none 13
|
||||||
|
Ethernet56 56,57,58,59 Ethernet56 100000 off none 14
|
||||||
|
Ethernet60 60,61,62,63 Ethernet60 100000 off none 15
|
||||||
|
Ethernet64 64,65,66,67 Ethernet64 100000 off none 16
|
||||||
|
Ethernet68 68,69,70,71 Ethernet68 100000 off none 17
|
||||||
|
Ethernet72 72,73,74,75 Ethernet72 100000 off none 18
|
||||||
|
Ethernet76 76,77,78,79 Ethernet76 100000 off none 19
|
||||||
|
Ethernet80 80,81,82,83 Ethernet80 100000 off none 20
|
||||||
|
Ethernet84 84,85,86,87 Ethernet84 100000 off none 21
|
||||||
|
Ethernet88 88,89,90,91 Ethernet88 100000 off none 22
|
||||||
|
Ethernet92 92,93,94,95 Ethernet92 100000 off none 23
|
||||||
|
Ethernet96 96,97,98,99 Ethernet96 100000 off none 24
|
||||||
|
Ethernet100 100,101,102,103 Ethernet100 100000 off none 25
|
||||||
|
Ethernet104 104,105,106,107 Ethernet104 100000 off none 26
|
||||||
|
Ethernet108 108,109,110,111 Ethernet108 100000 off none 27
|
||||||
|
Ethernet112 112,113,114,115 Ethernet112 100000 off none 28
|
||||||
|
Ethernet116 116,117,118,119 Ethernet116 100000 off none 29
|
||||||
|
Ethernet120 120,121,122,123 Ethernet120 100000 off none 30
|
||||||
|
Ethernet124 124,125,126,127 Ethernet124 100000 off none 31
|
||||||
|
Ethernet128 128 Ethernet128 10000 off none 32
|
||||||
|
Ethernet129 129 Ethernet129 10000 off none 33
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"chip_list": [
|
||||||
|
{
|
||||||
|
"id": "asic-0",
|
||||||
|
"chip_family": "Tofino",
|
||||||
|
"instance": 0,
|
||||||
|
"pcie_sysfs_prefix": "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0",
|
||||||
|
"pcie_domain": 0,
|
||||||
|
"pcie_bus": 5,
|
||||||
|
"pcie_fn": 0,
|
||||||
|
"pcie_dev": 0,
|
||||||
|
"pcie_int_mode": 1,
|
||||||
|
"sds_fw_path": "share/tofino_sds_fw/avago/firmware"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"instance": 0,
|
||||||
|
"p4_program_list": [
|
||||||
|
{
|
||||||
|
"id": "pgm-0",
|
||||||
|
"instance": 0,
|
||||||
|
"path": "switch",
|
||||||
|
"program-name": "switch",
|
||||||
|
"pd": "lib/tofinopd/switch/libpd.so",
|
||||||
|
"pd-thrift": "lib/tofinopd/switch/libpdthrift.so",
|
||||||
|
"table-config": "share/tofinopd/switch/context.json",
|
||||||
|
"tofino-bin": "share/tofinopd/switch/tofino.bin",
|
||||||
|
"switchapi": "lib/libswitchapi.so",
|
||||||
|
"sai": "lib/libsai.so",
|
||||||
|
"agent0": "lib/platform/x86_64-ufispace_s9180_32x-r0/libpltfm_mgr.so",
|
||||||
|
"switchapi_port_add": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"chip_list": [
|
||||||
|
{
|
||||||
|
"chip_family": "Tofino",
|
||||||
|
"sds_fw_path": "share/tofino_sds_fw/avago/firmware",
|
||||||
|
"instance": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"p4_devices": [
|
||||||
|
{
|
||||||
|
"device-id": 0,
|
||||||
|
"agent0": "lib/platform/x86_64-ufispace_s9180_32x-r0/libpltfm_mgr.so",
|
||||||
|
"p4_programs": [
|
||||||
|
{
|
||||||
|
"p4_pipelines": [
|
||||||
|
{
|
||||||
|
"p4_pipeline_name": "pipe",
|
||||||
|
"config": "share/switch/pipe/tofino.bin",
|
||||||
|
"context": "share/switch/pipe/context.json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"program-name": "switch",
|
||||||
|
"bfrt-config": "share/switch/bf-rt.json",
|
||||||
|
"model_json_path" : "share/switch/aug_model.json",
|
||||||
|
"switchapi_port_add": false,
|
||||||
|
"non_default_port_ppgs": 5
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"switch_options": [
|
||||||
|
{
|
||||||
|
"device-id": 0,
|
||||||
|
"model_json_path": "share/switch/aug_model.json",
|
||||||
|
"non_default_port_ppgs": 5,
|
||||||
|
"switchapi_port_add": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
1
device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku
Normal file
1
device/ufispace/x86_64-ufispace_s9180_32x-r0/default_sku
Normal file
@ -0,0 +1 @@
|
|||||||
|
UFISPACE-S9180-32X t1
|
10
device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol
Normal file
10
device/ufispace/x86_64-ufispace_s9180_32x-r0/fancontrol
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Configuration file generated by pwmconfig, changes will be lost
|
||||||
|
INTERVAL=10
|
||||||
|
DEVPATH=
|
||||||
|
DEVNAME=
|
||||||
|
FCTEMPS=
|
||||||
|
FCFANS=
|
||||||
|
MINTEMP=
|
||||||
|
MAXTEMP=
|
||||||
|
MINSTART=
|
||||||
|
MINSTOP=
|
@ -0,0 +1,4 @@
|
|||||||
|
CONSOLE_PORT=0x3f8
|
||||||
|
CONSOLE_DEV=0
|
||||||
|
CONSOLE_SPEED=115200
|
||||||
|
ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="module_blacklist=gpio_ich nomodeset pcie_aspm=off"
|
417
device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml
Normal file
417
device/ufispace/x86_64-ufispace_s9180_32x-r0/pcie.yaml
Normal file
@ -0,0 +1,417 @@
|
|||||||
|
- bus: '00'
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: 6f00
|
||||||
|
name: 'Host bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2
|
||||||
|
(rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '02'
|
||||||
|
fn: '0'
|
||||||
|
id: 6f04
|
||||||
|
name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI
|
||||||
|
Express Root Port 2 (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '02'
|
||||||
|
fn: '2'
|
||||||
|
id: 6f06
|
||||||
|
name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI
|
||||||
|
Express Root Port 2 (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '03'
|
||||||
|
fn: '0'
|
||||||
|
id: 6f08
|
||||||
|
name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI
|
||||||
|
Express Root Port 3 (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '03'
|
||||||
|
fn: '1'
|
||||||
|
id: 6f09
|
||||||
|
name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI
|
||||||
|
Express Root Port 3 (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '03'
|
||||||
|
fn: '2'
|
||||||
|
id: 6f0a
|
||||||
|
name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI
|
||||||
|
Express Root Port 3 (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '03'
|
||||||
|
fn: '3'
|
||||||
|
id: 6f0b
|
||||||
|
name: 'PCI bridge: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI
|
||||||
|
Express Root Port 3 (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '05'
|
||||||
|
fn: '0'
|
||||||
|
id: 6f28
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Map/VTd_Misc/System Management (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '05'
|
||||||
|
fn: '1'
|
||||||
|
id: 6f29
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D IIO Hot Plug (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '05'
|
||||||
|
fn: '2'
|
||||||
|
id: 6f2a
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D IIO RAS/Control Status/Global Errors (rev 03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '05'
|
||||||
|
fn: '4'
|
||||||
|
id: 6f2c
|
||||||
|
name: 'PIC: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D I/O APIC (rev
|
||||||
|
03)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: '14'
|
||||||
|
fn: '0'
|
||||||
|
id: 8c31
|
||||||
|
name: 'USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB
|
||||||
|
xHCI (rev 05)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: 1c
|
||||||
|
fn: '0'
|
||||||
|
id: 8c10
|
||||||
|
name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express
|
||||||
|
Root Port #1 (rev d5)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: 1f
|
||||||
|
fn: '0'
|
||||||
|
id: 8c54
|
||||||
|
name: 'ISA bridge: Intel Corporation C224 Series Chipset Family Server Standard
|
||||||
|
SKU LPC Controller (rev 05)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: 1f
|
||||||
|
fn: '2'
|
||||||
|
id: 8c02
|
||||||
|
name: 'SATA controller: Intel Corporation 8 Series/C220 Series Chipset Family 6-port
|
||||||
|
SATA Controller 1 [AHCI mode] (rev 05)'
|
||||||
|
- bus: '00'
|
||||||
|
dev: 1f
|
||||||
|
fn: '3'
|
||||||
|
id: 8c22
|
||||||
|
name: 'SMBus: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller
|
||||||
|
(rev 05)'
|
||||||
|
- bus: '01'
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: 6f50
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology
|
||||||
|
Register DMA Channel 0'
|
||||||
|
- bus: '01'
|
||||||
|
dev: '00'
|
||||||
|
fn: '1'
|
||||||
|
id: 6f51
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology
|
||||||
|
Register DMA Channel 1'
|
||||||
|
- bus: '01'
|
||||||
|
dev: '00'
|
||||||
|
fn: '2'
|
||||||
|
id: 6f52
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology
|
||||||
|
Register DMA Channel 2'
|
||||||
|
- bus: '01'
|
||||||
|
dev: '00'
|
||||||
|
fn: '3'
|
||||||
|
id: 6f53
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon Processor D Family QuickData Technology
|
||||||
|
Register DMA Channel 3'
|
||||||
|
- bus: '02'
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: 15ab
|
||||||
|
name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane'
|
||||||
|
- bus: '02'
|
||||||
|
dev: '00'
|
||||||
|
fn: '1'
|
||||||
|
id: 15ab
|
||||||
|
name: 'Ethernet controller: Intel Corporation Ethernet Connection X552 10 GbE Backplane'
|
||||||
|
- bus: '04'
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: '0010'
|
||||||
|
name: 'Unassigned class [ff00]: Device 1d1c:0010 (rev 10)'
|
||||||
|
- bus: 08
|
||||||
|
dev: '00'
|
||||||
|
fn: '0'
|
||||||
|
id: '1533'
|
||||||
|
name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev
|
||||||
|
03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0b
|
||||||
|
fn: '0'
|
||||||
|
id: 6f81
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D R3 QPI Link 0/1 (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0b
|
||||||
|
fn: '1'
|
||||||
|
id: 6f36
|
||||||
|
name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D R3 QPI Link 0/1 (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0b
|
||||||
|
fn: '2'
|
||||||
|
id: 6f37
|
||||||
|
name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D R3 QPI Link 0/1 (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0b
|
||||||
|
fn: '3'
|
||||||
|
id: 6f76
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D R3 QPI Link Debug (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0c
|
||||||
|
fn: '0'
|
||||||
|
id: 6fe0
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0c
|
||||||
|
fn: '1'
|
||||||
|
id: 6fe1
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0c
|
||||||
|
fn: '2'
|
||||||
|
id: 6fe2
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0c
|
||||||
|
fn: '3'
|
||||||
|
id: 6fe3
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0f
|
||||||
|
fn: '0'
|
||||||
|
id: 6ff8
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0f
|
||||||
|
fn: '4'
|
||||||
|
id: 6ffc
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0f
|
||||||
|
fn: '5'
|
||||||
|
id: 6ffd
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 0f
|
||||||
|
fn: '6'
|
||||||
|
id: 6ffe
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Caching Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '10'
|
||||||
|
fn: '0'
|
||||||
|
id: 6f1d
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D R2PCIe Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '10'
|
||||||
|
fn: '1'
|
||||||
|
id: 6f34
|
||||||
|
name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D R2PCIe Agent (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '10'
|
||||||
|
fn: '5'
|
||||||
|
id: 6f1e
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Ubox (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '10'
|
||||||
|
fn: '6'
|
||||||
|
id: 6f7d
|
||||||
|
name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Ubox (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '10'
|
||||||
|
fn: '7'
|
||||||
|
id: 6f1f
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Ubox (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '12'
|
||||||
|
fn: '0'
|
||||||
|
id: 6fa0
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Home Agent 0 (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '12'
|
||||||
|
fn: '1'
|
||||||
|
id: 6f30
|
||||||
|
name: 'Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Home Agent 0 (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '0'
|
||||||
|
id: 6fa8
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '1'
|
||||||
|
id: 6f71
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '2'
|
||||||
|
id: 6faa
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel Target Address Decoder (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '3'
|
||||||
|
id: 6fab
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel Target Address Decoder (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '4'
|
||||||
|
id: 6fac
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel Target Address Decoder (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '5'
|
||||||
|
id: 6fad
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel Target Address Decoder (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '6'
|
||||||
|
id: 6fae
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D DDRIO Channel 0/1 Broadcast (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '13'
|
||||||
|
fn: '7'
|
||||||
|
id: 6faf
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D DDRIO Global Broadcast (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '0'
|
||||||
|
id: 6fb0
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 0 Thermal Control (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '1'
|
||||||
|
id: 6fb1
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 1 Thermal Control (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '2'
|
||||||
|
id: 6fb2
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 0 Error (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '3'
|
||||||
|
id: 6fb3
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 1 Error (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '4'
|
||||||
|
id: 6fbc
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D DDRIO Channel 0/1 Interface (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '5'
|
||||||
|
id: 6fbd
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D DDRIO Channel 0/1 Interface (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '6'
|
||||||
|
id: 6fbe
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D DDRIO Channel 0/1 Interface (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '14'
|
||||||
|
fn: '7'
|
||||||
|
id: 6fbf
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D DDRIO Channel 0/1 Interface (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '15'
|
||||||
|
fn: '0'
|
||||||
|
id: 6fb4
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 2 Thermal Control (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '15'
|
||||||
|
fn: '1'
|
||||||
|
id: 6fb5
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 3 Thermal Control (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '15'
|
||||||
|
fn: '2'
|
||||||
|
id: 6fb6
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 2 Error (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: '15'
|
||||||
|
fn: '3'
|
||||||
|
id: 6fb7
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Memory Controller 0 - Channel 3 Error (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 1e
|
||||||
|
fn: '0'
|
||||||
|
id: 6f98
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Power Control Unit (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 1e
|
||||||
|
fn: '1'
|
||||||
|
id: 6f99
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Power Control Unit (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 1e
|
||||||
|
fn: '2'
|
||||||
|
id: 6f9a
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Power Control Unit (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 1e
|
||||||
|
fn: '3'
|
||||||
|
id: 6fc0
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Power Control Unit (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 1e
|
||||||
|
fn: '4'
|
||||||
|
id: 6f9c
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Power Control Unit (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 1f
|
||||||
|
fn: '0'
|
||||||
|
id: 6f88
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Power Control Unit (rev 03)'
|
||||||
|
- bus: ff
|
||||||
|
dev: 1f
|
||||||
|
fn: '2'
|
||||||
|
id: 6f8a
|
||||||
|
name: 'System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon
|
||||||
|
D Power Control Unit (rev 03)'
|
@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
|
||||||
|
"XCVR":
|
||||||
|
{
|
||||||
|
"xcvr_present":
|
||||||
|
{
|
||||||
|
"i2c":
|
||||||
|
{
|
||||||
|
"valmap-SFP": {"1":true, "0":false},
|
||||||
|
"valmap-QSFP": {"1":true, "0":false}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PSU":
|
||||||
|
{
|
||||||
|
"psu_present":
|
||||||
|
{
|
||||||
|
"i2c":
|
||||||
|
{
|
||||||
|
"valmap": { "1":true, "0":false }
|
||||||
|
},
|
||||||
|
"bmc":
|
||||||
|
{
|
||||||
|
"valmap": { "0x0280|":true, "0x0180|":false }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"psu_power_good":
|
||||||
|
{
|
||||||
|
"i2c":
|
||||||
|
{
|
||||||
|
"valmap": { "1": true, "0":false }
|
||||||
|
},
|
||||||
|
"bmc":
|
||||||
|
{
|
||||||
|
"valmap": { "0x0280|":true, "0x0180|":false }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"PSU_FAN_MAX_SPEED":"18000"
|
||||||
|
},
|
||||||
|
|
||||||
|
"FAN":
|
||||||
|
{
|
||||||
|
"direction":
|
||||||
|
{
|
||||||
|
"bmc":
|
||||||
|
{
|
||||||
|
"valmap": {"0": "UNKNOWN", "1":"INTAKE", "2":"EXHAUST"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"present":
|
||||||
|
{
|
||||||
|
"i2c":
|
||||||
|
{
|
||||||
|
"valmap": {"1":true, "0":false}
|
||||||
|
},
|
||||||
|
"bmc":
|
||||||
|
{
|
||||||
|
"valmap": { "0x0280|":true, "0x0180|":false }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"FAN_R_MAX_SPEED":"22000",
|
||||||
|
"FAN_F_MAX_SPEED":"22000"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
5879
device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json
Normal file
5879
device/ufispace/x86_64-ufispace_s9180_32x-r0/pddf/pddf-device.json
Normal file
File diff suppressed because it is too large
Load Diff
547
device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json
Normal file
547
device/ufispace/x86_64-ufispace_s9180_32x-r0/platform.json
Normal file
@ -0,0 +1,547 @@
|
|||||||
|
{
|
||||||
|
"chassis": {
|
||||||
|
"name": "S9180-32X",
|
||||||
|
"components": [
|
||||||
|
{
|
||||||
|
"name": "CPLD1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "BIOS"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "BMC"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "Fantray1_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray1_2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray2_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray2_2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray3_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray3_2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray4_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray4_2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fan_drawers":[
|
||||||
|
{
|
||||||
|
"name": "Fantray1",
|
||||||
|
"num_fans" : 2,
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "Fantray1_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray1_2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray2",
|
||||||
|
"num_fans" : 2,
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "Fantray2_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray2_2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray3",
|
||||||
|
"num_fans" : 2,
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "Fantray3_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray3_2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray4",
|
||||||
|
"num_fans" : 2,
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "Fantray4_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fantray4_2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"psus": [
|
||||||
|
{
|
||||||
|
"name": "PSU1",
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "PSU1_FAN1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"thermals": [
|
||||||
|
{
|
||||||
|
"name": "PSU1_TEMP1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PSU2",
|
||||||
|
"fans": [
|
||||||
|
{
|
||||||
|
"name": "PSU2_FAN1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"thermals": [
|
||||||
|
{
|
||||||
|
"name": "PSU2_TEMP1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"thermals": [
|
||||||
|
{
|
||||||
|
"name": "Temp_CPU_BOARD"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Temp_BMC"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Temp_MAC"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Temp_MAC_Front"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Temp_MAC_Rear"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"sfps": [
|
||||||
|
{
|
||||||
|
"name": "Ethernet0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet12"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet36"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet44"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet48"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet52"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet56"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet68"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet72"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet80"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet84"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet88"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet92"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet96"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet100"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet104"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet108"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet112"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet116"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet120"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet124"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ethernet129"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"interfaces": {
|
||||||
|
"Ethernet0": {
|
||||||
|
"index": "0,0,0,0",
|
||||||
|
"lanes": "1,2,3,4",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth0(Port0)"],
|
||||||
|
"4x25G": ["Eth0/1(Port0)", "Eth0/2(Port0)", "Eth0/3(Port0)", "Eth0/4(Port0)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet4": {
|
||||||
|
"index": "1,1,1,1",
|
||||||
|
"lanes": "5,6,7,8",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth1(Port1)"],
|
||||||
|
"4x25G": ["Eth1/1(Port1)", "Eth1/2(Port1)", "Eth1/3(Port1)", "Eth1/4(Port1)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet8": {
|
||||||
|
"index": "2,2,2,2",
|
||||||
|
"lanes": "9,10,11,12",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth2(Port2)"],
|
||||||
|
"4x25G": ["Eth2/1(Port2)", "Eth2/2(Port2)", "Eth2/3(Port2)", "Eth2/4(Port2)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet12": {
|
||||||
|
"index": "3,3,3,3",
|
||||||
|
"lanes": "13,14,15,16",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth3(Port3)"],
|
||||||
|
"4x25G": ["Eth3/1(Port3)", "Eth3/2(Port3)", "Eth3/3(Port3)", "Eth3/4(Port3)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet16": {
|
||||||
|
"index": "4,4,4,4",
|
||||||
|
"lanes": "17,18,19,20",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth4(Port4)"],
|
||||||
|
"4x25G": ["Eth4/1(Port4)", "Eth4/2(Port4)", "Eth4/3(Port4)", "Eth4/4(Port4)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet20": {
|
||||||
|
"index": "5,5,5,5",
|
||||||
|
"lanes": ",21,22,23,24",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth5(Port5)"],
|
||||||
|
"4x25G": ["Eth5/1(Port5)", "Eth5/2(Port5)", "Eth5/3(Port5)", "Eth5/4(Port5)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet24": {
|
||||||
|
"index": "6,6,6,6",
|
||||||
|
"lanes": "25,26,27,28",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth6(Port6)"],
|
||||||
|
"4x25G": ["Eth6/1(Port6)", "Eth6/2(Port6)", "Eth6/3(Port6)", "Eth6/4(Port6)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet28": {
|
||||||
|
"index": "7,7,7,7",
|
||||||
|
"lanes": "29,30,31,32",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth7(Port7)"],
|
||||||
|
"4x25G": ["Eth7/1(Port7)", "Eth7/2(Port7)", "Eth7/3(Port7)", "Eth7/4(Port7)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet32": {
|
||||||
|
"index": "8,8,8,8",
|
||||||
|
"lanes": "33,34,35,36",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth8(Port8)"],
|
||||||
|
"4x25G": ["Eth8/1(Port8)", "Eth8/2(Port8)", "Eth8/3(Port8)", "Eth8/4(Port8)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet36": {
|
||||||
|
"index": "9,9,9,9",
|
||||||
|
"lanes": "37,38,39,40",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth9(Port9)"],
|
||||||
|
"4x25G": ["Eth9/1(Port9)", "Eth9/2(Port9)", "Eth9/3(Port9)", "Eth9/4(Port9)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet40": {
|
||||||
|
"index": "10,10,10,10",
|
||||||
|
"lanes": "41,42,43,44",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth10(Port10)"],
|
||||||
|
"4x25G": ["Eth10/1(Port10)", "Eth10/2(Port10)", "Eth10/3(Port10)", "Eth10/4(Port10)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet44": {
|
||||||
|
"index": "11,11,11,11",
|
||||||
|
"lanes": "45,46,47,48",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth11(Port11)"],
|
||||||
|
"4x25G": ["Eth11/1(Port11)", "Eth11/2(Port11)", "Eth11/3(Port11)", "Eth11/4(Port11)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet48": {
|
||||||
|
"index": "12,12,12,12",
|
||||||
|
"lanes": "49,50,51,52",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth12(Port12)"],
|
||||||
|
"4x25G": ["Eth12/1(Port12)", "Eth12/2(Port12)", "Eth12/3(Port12)", "Eth12/4(Port12)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet52": {
|
||||||
|
"index": "13,13,13,13",
|
||||||
|
"lanes": "53,54,55,56",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth13(Port13)"],
|
||||||
|
"4x25G": ["Eth13/1(Port13)", "Eth13/2(Port13)", "Eth13/3(Port13)", "Eth13/4(Port13)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet56": {
|
||||||
|
"index": "14,14,14,14",
|
||||||
|
"lanes": "57,58,59,60",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth14(Port14)"],
|
||||||
|
"4x25G": ["Eth14/1(Port14)", "Eth14/2(Port14)", "Eth14/3(Port14)", "Eth14/4(Port14)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet60": {
|
||||||
|
"index": "15,15,15,15",
|
||||||
|
"lanes": "61,62,63,64",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth15(Port15)"],
|
||||||
|
"4x25G": ["Eth15/1(Port15)", "Eth15/2(Port15)", "Eth15/3(Port15)", "Eth15/4(Port15)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet64": {
|
||||||
|
"index": "16,16,16,16",
|
||||||
|
"lanes": "65,66,67,68",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth16(Port16)"],
|
||||||
|
"4x25G": ["Eth16/1(Port16)", "Eth16/2(Port16)", "Eth16/3(Port16)", "Eth16/4(Port16)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet68": {
|
||||||
|
"index": "17,17,17,17",
|
||||||
|
"lanes": "69,70,71,72",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth17(Port17)"],
|
||||||
|
"4x25G": ["Eth17/1(Port17)", "Eth17/2(Port17)", "Eth17/3(Port17)", "Eth17/4(Port17)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet72": {
|
||||||
|
"index": "18,18,18,18",
|
||||||
|
"lanes": "73,74,75,76",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth18(Port18)"],
|
||||||
|
"4x25G": ["Eth18/1(Port18)", "Eth18/2(Port18)", "Eth18/3(Port18)", "Eth18/4(Port18)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet76": {
|
||||||
|
"index": "19,19,19,19",
|
||||||
|
"lanes": "77,78,79,80",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth19(Port19)"],
|
||||||
|
"4x25G": ["Eth19/1(Port19)", "Eth19/2(Port19)", "Eth19/3(Port19)", "Eth19/4(Port19)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet80": {
|
||||||
|
"index": "20,20,20,20",
|
||||||
|
"lanes": "81,82,83,84",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth20(Port20)"],
|
||||||
|
"4x25G": ["Eth20/1(Port20)", "Eth20/2(Port20)", "Eth20/3(Port20)", "Eth20/4(Port20)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet84": {
|
||||||
|
"index": "21,21,21,21",
|
||||||
|
"lanes": "85,86,87,88",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth21(Port21)"],
|
||||||
|
"4x25G": ["Eth21/1(Port21)", "Eth21/2(Port21)", "Eth21/3(Port21)", "Eth21/4(Port21)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet88": {
|
||||||
|
"index": "22,22,22,22",
|
||||||
|
"lanes": "89,90,91,92",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth22(Port22)"],
|
||||||
|
"4x25G": ["Eth22/1(Port22)", "Eth22/2(Port22)", "Eth22/3(Port22)", "Eth22/4(Port22)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet92": {
|
||||||
|
"index": "23,23,23,23",
|
||||||
|
"lanes": "93,94,95,96",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth23(Port23)"],
|
||||||
|
"4x25G": ["Eth23/1(Port23)", "Eth23/2(Port23)", "Eth23/3(Port23)", "Eth23/4(Port23)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet96": {
|
||||||
|
"index": "24,24,24,24",
|
||||||
|
"lanes": "97,98,99,100",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth24(Port24)"],
|
||||||
|
"4x25G": ["Eth24/1(Port24)", "Eth24/2(Port24)", "Eth24/3(Port24)", "Eth24/4(Port24)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet100": {
|
||||||
|
"index": "25,25,25,25",
|
||||||
|
"lanes": "101,102,103,104",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth25(Port25)"],
|
||||||
|
"4x25G": ["Eth25/1(Port25)", "Eth25/2(Port25)", "Eth25/3(Port25)", "Eth25/4(Port25)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet104": {
|
||||||
|
"index": "26,26,26,26",
|
||||||
|
"lanes": "105,106,107,108",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth26(Port26)"],
|
||||||
|
"4x25G": ["Eth26/1(Port26)", "Eth26/2(Port26)", "Eth26/3(Port26)", "Eth26/4(Port26)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet108": {
|
||||||
|
"index": "27,27,27,27",
|
||||||
|
"lanes": "109,110,111,112",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth27(Port27)"],
|
||||||
|
"4x25G": ["Eth27/1(Port27)", "Eth27/2(Port27)", "Eth27/3(Port27)", "Eth27/4(Port27)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet112": {
|
||||||
|
"index": "28,28,28,28",
|
||||||
|
"lanes": "113,114,115,116",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth28(Port28)"],
|
||||||
|
"4x25G": ["Eth28/1(Port28)", "Eth28/2(Port28)", "Eth28/3(Port28)", "Eth28/4(Port28)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet116": {
|
||||||
|
"index": "29,29,29,29",
|
||||||
|
"lanes": "117,118,119,120",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth29(Port29)"],
|
||||||
|
"4x25G": ["Eth29/1(Port29)", "Eth29/2(Port29)", "Eth29/3(Port29)", "Eth29/4(Port29)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet120": {
|
||||||
|
"index": "30,30,30,30",
|
||||||
|
"lanes": "121,122,123,124",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth30(Port30)"],
|
||||||
|
"4x25G": ["Eth30/1(Port30)", "Eth30/2(Port30)", "Eth30/3(Port30)", "Eth30/4(Port30)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet124": {
|
||||||
|
"index": "31,31,31,31",
|
||||||
|
"lanes": "125,126,127,128",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x100G": ["Eth31(Port31)"],
|
||||||
|
"4x25G": ["Eth31/1(Port31)", "Eth31/2(Port31)", "Eth31/3(Port31)", "Eth31/4(Port31)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet128": {
|
||||||
|
"index": "32",
|
||||||
|
"lanes": "129",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x10G": ["Eth32(Port32)"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Ethernet129": {
|
||||||
|
"index": "33",
|
||||||
|
"lanes": "130",
|
||||||
|
"breakout_modes": {
|
||||||
|
"1x10G": ["Eth33(Port33)"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
barefoot
|
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"skip_pcied": false,
|
||||||
|
"skip_fancontrol": false,
|
||||||
|
"skip_thermalctld": false,
|
||||||
|
"skip_ledd": true,
|
||||||
|
"skip_xcvrd": false,
|
||||||
|
"skip_psud": false,
|
||||||
|
"skip_syseepromd": false
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
# libsensors configuration file
|
||||||
|
|
||||||
|
bus "i2c-0" "I2C I801"
|
||||||
|
chip "tmp75-i2c-*-4f"
|
||||||
|
label temp1 "CPU Board Temp"
|
||||||
|
set temp1_max 70
|
||||||
|
set temp1_max_hyst 75
|
||||||
|
set temp1_crit 85
|
||||||
|
|
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"services_to_ignore": [],
|
||||||
|
"devices_to_ignore": [
|
||||||
|
"asic",
|
||||||
|
"psu",
|
||||||
|
"fan"
|
||||||
|
],
|
||||||
|
"user_defined_checkers": [],
|
||||||
|
"polling_interval": 60,
|
||||||
|
"led_color": {
|
||||||
|
"fault": "yellow",
|
||||||
|
"normal": "green",
|
||||||
|
"booting": "blinking_green"
|
||||||
|
}
|
||||||
|
}
|
5
platform/barefoot/bfn-platform-ufispace.mk
Normal file
5
platform/barefoot/bfn-platform-ufispace.mk
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
BFN_UFISPACE_PLATFORM = bfnplatform-ufispace_1.0.0_amd64.deb
|
||||||
|
$(BFN_UFISPACE_PLATFORM)_URL = "https://github.com/ufispace-dev/bf_sde_bsp/raw/master/sonic/9.12.0/$(BFN_UFISPACE_PLATFORM)"
|
||||||
|
|
||||||
|
SONIC_ONLINE_DEBS += $(BFN_UFISPACE_PLATFORM) # $(BFN_SAI_DEV)
|
||||||
|
$(BFN_SAI_DEV)_DEPENDS += $(BFN_UFISPACE_PLATFORM)
|
@ -12,7 +12,7 @@ SONIC_COPY_FILES += $(SYNCD_INIT_COMMON_SCRIPT)
|
|||||||
$(DOCKER_SAISERVER_BFN)_DEPENDS += $(SAISERVER)
|
$(DOCKER_SAISERVER_BFN)_DEPENDS += $(SAISERVER)
|
||||||
# Install syncd for reuse the config fun
|
# Install syncd for reuse the config fun
|
||||||
#$(DOCKER_SAISERVER_BFN)_DEPENDS += $(SYNCD)
|
#$(DOCKER_SAISERVER_BFN)_DEPENDS += $(SYNCD)
|
||||||
$(DOCKER_SAISERVER_BFN)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM) $(LIBTHRIFT_0_14_1)
|
$(DOCKER_SAISERVER_BFN)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM) $(LIBTHRIFT_0_14_1)
|
||||||
$(DOCKER_SAISERVER_BFN)_FILES += $(SYNCD_INIT_COMMON_SCRIPT)
|
$(DOCKER_SAISERVER_BFN)_FILES += $(SYNCD_INIT_COMMON_SCRIPT)
|
||||||
|
|
||||||
# Same dependence as ENABLE_SYNCD_RPC
|
# Same dependence as ENABLE_SYNCD_RPC
|
||||||
@ -20,7 +20,7 @@ $(DOCKER_SAISERVER_BFN)_DEPENDS += $(LIBSAITHRIFT_DEV) $(LIBTHRIFT_0_14_1_DEV)
|
|||||||
|
|
||||||
# Runtime dependency on sai is set only for syncd
|
# Runtime dependency on sai is set only for syncd
|
||||||
#$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
#$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
||||||
$(DOCKER_SAISERVER_BFN)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
$(DOCKER_SAISERVER_BFN)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM)
|
||||||
|
|
||||||
$(DOCKER_SAISERVER_BFN)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE)
|
$(DOCKER_SAISERVER_BFN)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE)
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ $(SONIC_ONE_IMAGE)_MACHINE = barefoot
|
|||||||
$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie
|
$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie
|
||||||
$(SONIC_ONE_IMAGE)_INSTALLS += $(BFN_MODULE)
|
$(SONIC_ONE_IMAGE)_INSTALLS += $(BFN_MODULE)
|
||||||
$(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR)
|
$(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR)
|
||||||
|
$(SONIC_ONE_IMAGE)_INSTALLS += $(PDDF_PLATFORM_MODULE)
|
||||||
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_PLATFORM_MODULE)
|
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_PLATFORM_MODULE)
|
||||||
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_PLATFORM_MODULE)
|
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_PLATFORM_MODULE)
|
||||||
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_NEWPORT_PLATFORM_MODULE)
|
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_NEWPORT_PLATFORM_MODULE)
|
||||||
@ -15,6 +16,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9280_64X_PLATFORM_MODULE)
|
|||||||
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_QS_PLATFORM_MODULE)
|
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(BFN_MONTARA_QS_PLATFORM_MODULE)
|
||||||
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_610_PLATFORM_MODULE)
|
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_610_PLATFORM_MODULE)
|
||||||
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_710_PLATFORM_MODULE)
|
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_710_PLATFORM_MODULE)
|
||||||
|
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(UFISPACE_S9180_32X_PLATFORM_MODULE)
|
||||||
ifeq ($(INSTALL_DEBUG_TOOLS),y)
|
ifeq ($(INSTALL_DEBUG_TOOLS),y)
|
||||||
$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES)
|
$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES)
|
||||||
$(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES))
|
$(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES))
|
||||||
|
14
platform/barefoot/platform-modules-ufispace.mk
Normal file
14
platform/barefoot/platform-modules-ufispace.mk
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Ufispace S9180-32X Platform modules
|
||||||
|
|
||||||
|
UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION = 1.1.0
|
||||||
|
|
||||||
|
export UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION
|
||||||
|
|
||||||
|
UFISPACE_S9180_32X_PLATFORM_MODULE = sonic-platform-ufispace-s9180-32x_$(UFISPACE_S9180_32X_PLATFORM_MODULE_VERSION)_amd64.deb
|
||||||
|
$(UFISPACE_S9180_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ufispace
|
||||||
|
$(UFISPACE_S9180_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON)
|
||||||
|
$(UFISPACE_S9180_32X_PLATFORM_MODULE)_PLATFORM = x86_64-ufispace_s9180_32x-r0
|
||||||
|
SONIC_DPKG_DEBS += $(UFISPACE_S9180_32X_PLATFORM_MODULE)
|
||||||
|
|
||||||
|
$(eval $(call add_extra_package,$(UFISPACE_S9180_32X_PLATFORM_MODULE)))
|
||||||
|
|
@ -6,6 +6,7 @@ include $(PLATFORM_PATH)/platform-modules-bfn-newport.mk
|
|||||||
include $(PLATFORM_PATH)/platform-modules-wnc-osw1800.mk
|
include $(PLATFORM_PATH)/platform-modules-wnc-osw1800.mk
|
||||||
include $(PLATFORM_PATH)/platform-modules-ingrasys.mk
|
include $(PLATFORM_PATH)/platform-modules-ingrasys.mk
|
||||||
include $(PLATFORM_PATH)/platform-modules-netberg.mk
|
include $(PLATFORM_PATH)/platform-modules-netberg.mk
|
||||||
|
include $(PLATFORM_PATH)/platform-modules-ufispace.mk
|
||||||
include $(PLATFORM_PATH)/bfn-sai.mk
|
include $(PLATFORM_PATH)/bfn-sai.mk
|
||||||
include $(PLATFORM_PATH)/docker-syncd-bfn.mk
|
include $(PLATFORM_PATH)/docker-syncd-bfn.mk
|
||||||
include $(PLATFORM_PATH)/docker-syncd-bfn-rpc.mk
|
include $(PLATFORM_PATH)/docker-syncd-bfn-rpc.mk
|
||||||
@ -15,6 +16,7 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk
|
|||||||
include $(PLATFORM_PATH)/bfn-platform.mk
|
include $(PLATFORM_PATH)/bfn-platform.mk
|
||||||
#include $(PLATFORM_PATH)/bfn-platform-wnc.mk
|
#include $(PLATFORM_PATH)/bfn-platform-wnc.mk
|
||||||
#include $(PLATFORM_PATH)/bfn-platform-ingrasys.mk
|
#include $(PLATFORM_PATH)/bfn-platform-ingrasys.mk
|
||||||
|
include $(PLATFORM_PATH)/bfn-platform-ufispace.mk
|
||||||
include $(PLATFORM_PATH)/bfn-modules.mk
|
include $(PLATFORM_PATH)/bfn-modules.mk
|
||||||
include $(PLATFORM_PATH)/docker-saiserver-bfn.mk
|
include $(PLATFORM_PATH)/docker-saiserver-bfn.mk
|
||||||
|
|
||||||
@ -23,7 +25,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT) \
|
|||||||
|
|
||||||
# Inject sai into syncd
|
# Inject sai into syncd
|
||||||
#$(SYNCD)_DEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
#$(SYNCD)_DEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
||||||
$(SYNCD)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
$(SYNCD)_DEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM)
|
||||||
$(SYNCD)_UNINSTALLS += $(BFN_SAI)
|
$(SYNCD)_UNINSTALLS += $(BFN_SAI)
|
||||||
|
|
||||||
ifeq ($(ENABLE_SYNCD_RPC),y)
|
ifeq ($(ENABLE_SYNCD_RPC),y)
|
||||||
@ -33,6 +35,6 @@ endif
|
|||||||
|
|
||||||
# Runtime dependency on sai is set only for syncd
|
# Runtime dependency on sai is set only for syncd
|
||||||
#$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
#$(SYNCD)_RDEPENDS += $(BFN_SAI) $(WNC_OSW1800_PLATFORM) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
||||||
$(SYNCD)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_PLATFORM)
|
$(SYNCD)_RDEPENDS += $(BFN_SAI) $(BFN_INGRASYS_PLATFORM) $(BFN_UFISPACE_PLATFORM) $(BFN_PLATFORM)
|
||||||
|
|
||||||
export SONIC_BUFFER_MODEL=dynamic
|
export SONIC_BUFFER_MODEL=dynamic
|
||||||
|
674
platform/barefoot/sonic-platform-modules-ufispace/LICENSE
Normal file
674
platform/barefoot/sonic-platform-modules-ufispace/LICENSE
Normal file
@ -0,0 +1,674 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
{one line to give the program's name and a brief idea of what it does.}
|
||||||
|
Copyright (C) {year} {name of author}
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
{project} Copyright (C) {year} {fullname}
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
@ -0,0 +1,5 @@
|
|||||||
|
sonic-ufispace-platform-modules (1.1.0) unstable; urgency=low
|
||||||
|
|
||||||
|
* Add support for S9180-32X.
|
||||||
|
|
||||||
|
-- Ufispace <leo.yt.lin@ufispace.com> Tue, 19 Apr 2022 17:10:58 +0800
|
@ -0,0 +1 @@
|
|||||||
|
9
|
@ -0,0 +1,10 @@
|
|||||||
|
Source: sonic-ufispace-platform-modules
|
||||||
|
Section: main
|
||||||
|
Priority: extra
|
||||||
|
Maintainer: Leo Lin <leo.yt.lin@ufispace.com>, Jason Tsai <jason.cy.tsai@ufispace.com>
|
||||||
|
Build-Depends: debhelper (>= 9), bzip2
|
||||||
|
Standards-Version: 1.0.0
|
||||||
|
|
||||||
|
Package: sonic-platform-ufispace-s9180-32x
|
||||||
|
Architecture: amd64
|
||||||
|
Description: This package contains s9180-32x platform driver utility for SONiC project.
|
88
platform/barefoot/sonic-platform-modules-ufispace/debian/rules
Executable file
88
platform/barefoot/sonic-platform-modules-ufispace/debian/rules
Executable file
@ -0,0 +1,88 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
# -*- makefile -*-
|
||||||
|
# Sample debian/rules that uses debhelper.
|
||||||
|
# This file was originally written by Joey Hess and Craig Small.
|
||||||
|
# As a special exception, when this file is copied by dh-make into a
|
||||||
|
# dh-make output file, you may use that output file without restriction.
|
||||||
|
# This special exception was added by Craig Small in version 0.37 of dh-make.
|
||||||
|
|
||||||
|
include /usr/share/dpkg/pkg-info.mk
|
||||||
|
|
||||||
|
# Uncomment this to turn on verbose mode.
|
||||||
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
export INSTALL_MOD_DIR:=extra
|
||||||
|
|
||||||
|
PYTHON3 ?= python3
|
||||||
|
|
||||||
|
PACKAGE_PRE_NAME := sonic-platform-ufispace
|
||||||
|
KVERSION ?= $(shell uname -r)
|
||||||
|
KERNEL_SRC := /lib/modules/$(KVERSION)
|
||||||
|
MOD_SRC_DIR:= $(shell pwd)
|
||||||
|
MODULE_DIRS:= s9180-32x
|
||||||
|
MODULE_DIR := modules
|
||||||
|
UTILS_DIR := utils
|
||||||
|
SERVICE_DIR := service
|
||||||
|
CONF_DIR := conf
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@ --with systemd,python3 --buildsystem=pybuild
|
||||||
|
|
||||||
|
clean:
|
||||||
|
dh_testdir
|
||||||
|
dh_testroot
|
||||||
|
dh_clean
|
||||||
|
(for mod in $(MODULE_DIRS); do \
|
||||||
|
make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \
|
||||||
|
done)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
build:
|
||||||
|
(for mod in $(MODULE_DIRS); do \
|
||||||
|
make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \
|
||||||
|
cd -; \
|
||||||
|
cd $(MOD_SRC_DIR)/$${mod}; \
|
||||||
|
if [ -f sonic_platform_setup.py ]; then \
|
||||||
|
$(PYTHON3) sonic_platform_setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}; \
|
||||||
|
echo "Finished makig whl package for $$mod"; \
|
||||||
|
fi; \
|
||||||
|
cd -; \
|
||||||
|
done)
|
||||||
|
|
||||||
|
binary: binary-arch binary-indep
|
||||||
|
|
||||||
|
binary-arch:
|
||||||
|
|
||||||
|
binary-indep:
|
||||||
|
dh_testdir
|
||||||
|
dh_installdirs
|
||||||
|
(for mod in $(MODULE_DIRS); do \
|
||||||
|
dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \
|
||||||
|
cp $(MOD_SRC_DIR)/$${mod}/$(MODULE_DIR)/*.ko debian/$(PACKAGE_PRE_NAME)-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \
|
||||||
|
dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} usr/local/bin; \
|
||||||
|
cp $(MOD_SRC_DIR)/$${mod}/$(UTILS_DIR)/* debian/$(PACKAGE_PRE_NAME)-$${mod}/usr/local/bin; \
|
||||||
|
dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} lib/systemd/system; \
|
||||||
|
cp $(MOD_SRC_DIR)/$${mod}/$(SERVICE_DIR)/*.service debian/$(PACKAGE_PRE_NAME)-$${mod}/lib/systemd/system; \
|
||||||
|
cd $(MOD_SRC_DIR)/$${mod}; \
|
||||||
|
cd -; \
|
||||||
|
done)
|
||||||
|
|
||||||
|
# Resuming debhelper scripts
|
||||||
|
dh_testroot
|
||||||
|
dh_install
|
||||||
|
dh_installchangelogs
|
||||||
|
dh_installdocs
|
||||||
|
dh_systemd_enable
|
||||||
|
dh_installinit
|
||||||
|
dh_systemd_start
|
||||||
|
dh_link
|
||||||
|
dh_fixperms
|
||||||
|
dh_compress
|
||||||
|
dh_strip
|
||||||
|
dh_installdeb
|
||||||
|
dh_gencontrol
|
||||||
|
dh_md5sums
|
||||||
|
dh_builddeb
|
||||||
|
|
||||||
|
.PHONY: build binary binary-arch binary-indep clean
|
@ -0,0 +1 @@
|
|||||||
|
s9180-32x/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-ufispace_s9180_32x-r0/pddf
|
@ -0,0 +1,5 @@
|
|||||||
|
depmod -a
|
||||||
|
systemctl enable pddf-platform-init.service
|
||||||
|
systemctl start pddf-platform-init.service
|
||||||
|
systemctl enable platform-swss-restart.service
|
||||||
|
systemctl start --no-block platform-swss-restart.service
|
@ -0,0 +1,5 @@
|
|||||||
|
MODULE_NAME = x86-64-ufispace-s9180-32x-sys-eeprom.o i2c-smbus.o
|
||||||
|
obj-m := $(MODULE_NAME)
|
||||||
|
|
||||||
|
CFLAGS_pddf_custom_sysstatus_module.o := -I$(M)/../../../../pddf/i2c/modules/include
|
||||||
|
KBUILD_EXTRA_SYMBOLS := $(M)/../../../../pddf/i2c/Module.symvers.PDDF
|
@ -0,0 +1,423 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* i2c-smbus.c - SMBus extensions to the I2C protocol
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 David Brownell
|
||||||
|
* Copyright (C) 2010-2019 Jean Delvare <jdelvare@suse.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __STDC_WANT_LIB_EXT1__ 1
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/dmi.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/i2c-smbus.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/of_irq.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/workqueue.h>
|
||||||
|
|
||||||
|
static int disable_i2c_register_spd = 1;
|
||||||
|
module_param(disable_i2c_register_spd, int, 0);
|
||||||
|
|
||||||
|
struct i2c_smbus_alert {
|
||||||
|
struct work_struct alert;
|
||||||
|
struct i2c_client *ara; /* Alert response address */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct alert_data {
|
||||||
|
unsigned short addr;
|
||||||
|
enum i2c_alert_protocol type;
|
||||||
|
unsigned int data;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* If this is the alerting device, notify its driver */
|
||||||
|
static int smbus_do_alert(struct device *dev, void *addrp)
|
||||||
|
{
|
||||||
|
struct i2c_client *client = i2c_verify_client(dev);
|
||||||
|
struct alert_data *data = addrp;
|
||||||
|
struct i2c_driver *driver;
|
||||||
|
|
||||||
|
if (!client || client->addr != data->addr)
|
||||||
|
return 0;
|
||||||
|
if (client->flags & I2C_CLIENT_TEN)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Drivers should either disable alerts, or provide at least
|
||||||
|
* a minimal handler. Lock so the driver won't change.
|
||||||
|
*/
|
||||||
|
device_lock(dev);
|
||||||
|
if (client->dev.driver) {
|
||||||
|
driver = to_i2c_driver(client->dev.driver);
|
||||||
|
if (driver->alert)
|
||||||
|
driver->alert(client, data->type, data->data);
|
||||||
|
else
|
||||||
|
dev_warn(&client->dev, "no driver alert()!\n");
|
||||||
|
} else
|
||||||
|
dev_dbg(&client->dev, "alert with no driver\n");
|
||||||
|
device_unlock(dev);
|
||||||
|
|
||||||
|
/* Stop iterating after we find the device */
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The alert IRQ handler needs to hand work off to a task which can issue
|
||||||
|
* SMBus calls, because those sleeping calls can't be made in IRQ context.
|
||||||
|
*/
|
||||||
|
static irqreturn_t smbus_alert(int irq, void *d)
|
||||||
|
{
|
||||||
|
struct i2c_smbus_alert *alert = d;
|
||||||
|
struct i2c_client *ara;
|
||||||
|
|
||||||
|
ara = alert->ara;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
s32 status;
|
||||||
|
struct alert_data data;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Devices with pending alerts reply in address order, low
|
||||||
|
* to high, because of slave transmit arbitration. After
|
||||||
|
* responding, an SMBus device stops asserting SMBALERT#.
|
||||||
|
*
|
||||||
|
* Note that SMBus 2.0 reserves 10-bit addresses for future
|
||||||
|
* use. We neither handle them, nor try to use PEC here.
|
||||||
|
*/
|
||||||
|
status = i2c_smbus_read_byte(ara);
|
||||||
|
if (status < 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
data.data = status & 1;
|
||||||
|
data.addr = status >> 1;
|
||||||
|
data.type = I2C_PROTOCOL_SMBUS_ALERT;
|
||||||
|
|
||||||
|
dev_dbg(&ara->dev, "SMBALERT# from dev 0x%02x, flag %d\n",
|
||||||
|
data.addr, data.data);
|
||||||
|
|
||||||
|
/* Notify driver for the device which issued the alert */
|
||||||
|
device_for_each_child(&ara->adapter->dev, &data,
|
||||||
|
smbus_do_alert);
|
||||||
|
}
|
||||||
|
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void smbalert_work(struct work_struct *work)
|
||||||
|
{
|
||||||
|
struct i2c_smbus_alert *alert;
|
||||||
|
|
||||||
|
alert = container_of(work, struct i2c_smbus_alert, alert);
|
||||||
|
|
||||||
|
smbus_alert(0, alert);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup SMBALERT# infrastructure */
|
||||||
|
static int smbalert_probe(struct i2c_client *ara,
|
||||||
|
const struct i2c_device_id *id)
|
||||||
|
{
|
||||||
|
struct i2c_smbus_alert_setup *setup = dev_get_platdata(&ara->dev);
|
||||||
|
struct i2c_smbus_alert *alert;
|
||||||
|
struct i2c_adapter *adapter = ara->adapter;
|
||||||
|
int res, irq;
|
||||||
|
|
||||||
|
alert = devm_kzalloc(&ara->dev, sizeof(struct i2c_smbus_alert),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!alert)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (setup) {
|
||||||
|
irq = setup->irq;
|
||||||
|
} else {
|
||||||
|
irq = of_irq_get_byname(adapter->dev.of_node, "smbus_alert");
|
||||||
|
if (irq <= 0)
|
||||||
|
return irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
INIT_WORK(&alert->alert, smbalert_work);
|
||||||
|
alert->ara = ara;
|
||||||
|
|
||||||
|
if (irq > 0) {
|
||||||
|
res = devm_request_threaded_irq(&ara->dev, irq,
|
||||||
|
NULL, smbus_alert,
|
||||||
|
IRQF_SHARED | IRQF_ONESHOT,
|
||||||
|
"smbus_alert", alert);
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_set_clientdata(ara, alert);
|
||||||
|
dev_info(&adapter->dev, "supports SMBALERT#\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IRQ and memory resources are managed so they are freed automatically */
|
||||||
|
static int smbalert_remove(struct i2c_client *ara)
|
||||||
|
{
|
||||||
|
struct i2c_smbus_alert *alert = i2c_get_clientdata(ara);
|
||||||
|
|
||||||
|
cancel_work_sync(&alert->alert);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct i2c_device_id smbalert_ids[] = {
|
||||||
|
{ "smbus_alert", 0 },
|
||||||
|
{ /* LIST END */ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(i2c, smbalert_ids);
|
||||||
|
|
||||||
|
static struct i2c_driver smbalert_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "smbus_alert",
|
||||||
|
},
|
||||||
|
.probe = smbalert_probe,
|
||||||
|
.remove = smbalert_remove,
|
||||||
|
.id_table = smbalert_ids,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i2c_handle_smbus_alert - Handle an SMBus alert
|
||||||
|
* @ara: the ARA client on the relevant adapter
|
||||||
|
* Context: can't sleep
|
||||||
|
*
|
||||||
|
* Helper function to be called from an I2C bus driver's interrupt
|
||||||
|
* handler. It will schedule the alert work, in turn calling the
|
||||||
|
* corresponding I2C device driver's alert function.
|
||||||
|
*
|
||||||
|
* It is assumed that ara is a valid i2c client previously returned by
|
||||||
|
* i2c_new_smbus_alert_device().
|
||||||
|
*/
|
||||||
|
int i2c_handle_smbus_alert(struct i2c_client *ara)
|
||||||
|
{
|
||||||
|
struct i2c_smbus_alert *alert = i2c_get_clientdata(ara);
|
||||||
|
|
||||||
|
return schedule_work(&alert->alert);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(i2c_handle_smbus_alert);
|
||||||
|
|
||||||
|
module_i2c_driver(smbalert_driver);
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_I2C_SLAVE)
|
||||||
|
#define SMBUS_HOST_NOTIFY_LEN 3
|
||||||
|
struct i2c_slave_host_notify_status {
|
||||||
|
u8 index;
|
||||||
|
u8 addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int i2c_slave_host_notify_cb(struct i2c_client *client,
|
||||||
|
enum i2c_slave_event event, u8 *val)
|
||||||
|
{
|
||||||
|
struct i2c_slave_host_notify_status *status = client->dev.platform_data;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case I2C_SLAVE_WRITE_RECEIVED:
|
||||||
|
/* We only retrieve the first byte received (addr)
|
||||||
|
* since there is currently no support to retrieve the data
|
||||||
|
* parameter from the client.
|
||||||
|
*/
|
||||||
|
if (status->index == 0)
|
||||||
|
status->addr = *val;
|
||||||
|
if (status->index < U8_MAX)
|
||||||
|
status->index++;
|
||||||
|
break;
|
||||||
|
case I2C_SLAVE_STOP:
|
||||||
|
if (status->index == SMBUS_HOST_NOTIFY_LEN)
|
||||||
|
i2c_handle_smbus_host_notify(client->adapter,
|
||||||
|
status->addr);
|
||||||
|
fallthrough;
|
||||||
|
case I2C_SLAVE_WRITE_REQUESTED:
|
||||||
|
status->index = 0;
|
||||||
|
break;
|
||||||
|
case I2C_SLAVE_READ_REQUESTED:
|
||||||
|
case I2C_SLAVE_READ_PROCESSED:
|
||||||
|
*val = 0xff;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i2c_new_slave_host_notify_device - get a client for SMBus host-notify support
|
||||||
|
* @adapter: the target adapter
|
||||||
|
* Context: can sleep
|
||||||
|
*
|
||||||
|
* Setup handling of the SMBus host-notify protocol on a given I2C bus segment.
|
||||||
|
*
|
||||||
|
* Handling is done by creating a device and its callback and handling data
|
||||||
|
* received via the SMBus host-notify address (0x8)
|
||||||
|
*
|
||||||
|
* This returns the client, which should be ultimately freed using
|
||||||
|
* i2c_free_slave_host_notify_device(); or an ERRPTR to indicate an error.
|
||||||
|
*/
|
||||||
|
struct i2c_client *i2c_new_slave_host_notify_device(struct i2c_adapter *adapter)
|
||||||
|
{
|
||||||
|
struct i2c_board_info host_notify_board_info = {
|
||||||
|
I2C_BOARD_INFO("smbus_host_notify", 0x08),
|
||||||
|
.flags = I2C_CLIENT_SLAVE,
|
||||||
|
};
|
||||||
|
struct i2c_slave_host_notify_status *status;
|
||||||
|
struct i2c_client *client;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
status = kzalloc(sizeof(struct i2c_slave_host_notify_status),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!status)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
host_notify_board_info.platform_data = status;
|
||||||
|
|
||||||
|
client = i2c_new_client_device(adapter, &host_notify_board_info);
|
||||||
|
if (IS_ERR(client)) {
|
||||||
|
kfree(status);
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = i2c_slave_register(client, i2c_slave_host_notify_cb);
|
||||||
|
if (ret) {
|
||||||
|
i2c_unregister_device(client);
|
||||||
|
kfree(status);
|
||||||
|
return ERR_PTR(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(i2c_new_slave_host_notify_device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i2c_free_slave_host_notify_device - free the client for SMBus host-notify
|
||||||
|
* support
|
||||||
|
* @client: the client to free
|
||||||
|
* Context: can sleep
|
||||||
|
*
|
||||||
|
* Free the i2c_client allocated via i2c_new_slave_host_notify_device
|
||||||
|
*/
|
||||||
|
void i2c_free_slave_host_notify_device(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
if (IS_ERR_OR_NULL(client))
|
||||||
|
return;
|
||||||
|
|
||||||
|
i2c_slave_unregister(client);
|
||||||
|
kfree(client->dev.platform_data);
|
||||||
|
i2c_unregister_device(client);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(i2c_free_slave_host_notify_device);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SPD is not part of SMBus but we include it here for convenience as the
|
||||||
|
* target systems are the same.
|
||||||
|
* Restrictions to automatic SPD instantiation:
|
||||||
|
* - Only works if all filled slots have the same memory type
|
||||||
|
* - Only works for DDR2, DDR3 and DDR4 for now
|
||||||
|
* - Only works on systems with 1 to 4 memory slots
|
||||||
|
*/
|
||||||
|
#if IS_ENABLED(CONFIG_DMI)
|
||||||
|
void i2c_register_spd(struct i2c_adapter *adap)
|
||||||
|
{
|
||||||
|
int n, slot_count = 0, dimm_count = 0;
|
||||||
|
u16 handle;
|
||||||
|
u8 common_mem_type = 0x0, mem_type;
|
||||||
|
u64 mem_size;
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
//disable spd scan to prevent address conflict between spd and sys eeprom
|
||||||
|
if (disable_i2c_register_spd == 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((handle = dmi_memdev_handle(slot_count)) != 0xffff) {
|
||||||
|
slot_count++;
|
||||||
|
|
||||||
|
/* Skip empty slots */
|
||||||
|
mem_size = dmi_memdev_size(handle);
|
||||||
|
if (!mem_size)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Skip undefined memory type */
|
||||||
|
mem_type = dmi_memdev_type(handle);
|
||||||
|
if (mem_type <= 0x02) /* Invalid, Other, Unknown */
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!common_mem_type) {
|
||||||
|
/* First filled slot */
|
||||||
|
common_mem_type = mem_type;
|
||||||
|
} else {
|
||||||
|
/* Check that all filled slots have the same type */
|
||||||
|
if (mem_type != common_mem_type) {
|
||||||
|
dev_warn(&adap->dev,
|
||||||
|
"Different memory types mixed, not instantiating SPD\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dimm_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No useful DMI data, bail out */
|
||||||
|
if (!dimm_count)
|
||||||
|
return;
|
||||||
|
|
||||||
|
dev_info(&adap->dev, "%d/%d memory slots populated (from DMI)\n",
|
||||||
|
dimm_count, slot_count);
|
||||||
|
|
||||||
|
if (slot_count > 4) {
|
||||||
|
dev_warn(&adap->dev,
|
||||||
|
"Systems with more than 4 memory slots not supported yet, not instantiating SPD\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (common_mem_type) {
|
||||||
|
case 0x13: /* DDR2 */
|
||||||
|
case 0x18: /* DDR3 */
|
||||||
|
case 0x1C: /* LPDDR2 */
|
||||||
|
case 0x1D: /* LPDDR3 */
|
||||||
|
name = "spd";
|
||||||
|
break;
|
||||||
|
case 0x1A: /* DDR4 */
|
||||||
|
case 0x1E: /* LPDDR4 */
|
||||||
|
name = "ee1004";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dev_info(&adap->dev,
|
||||||
|
"Memory type 0x%02x not supported yet, not instantiating SPD\n",
|
||||||
|
common_mem_type);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't know in which slots the memory modules are. We could
|
||||||
|
* try to guess from the slot names, but that would be rather complex
|
||||||
|
* and unreliable, so better probe all possible addresses until we
|
||||||
|
* have found all memory modules.
|
||||||
|
*/
|
||||||
|
for (n = 0; n < slot_count && dimm_count; n++) {
|
||||||
|
struct i2c_board_info info;
|
||||||
|
unsigned short addr_list[2];
|
||||||
|
|
||||||
|
#ifdef __STDC_LIB_EXT1__
|
||||||
|
memset_s(&info, sizeof(struct i2c_board_info), 0, sizeof(struct i2c_board_info));
|
||||||
|
#else
|
||||||
|
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||||
|
#endif
|
||||||
|
strlcpy(info.type, name, I2C_NAME_SIZE);
|
||||||
|
addr_list[0] = 0x50 + n;
|
||||||
|
addr_list[1] = I2C_CLIENT_END;
|
||||||
|
|
||||||
|
if (!IS_ERR(i2c_new_scanned_device(adap, &info, addr_list, NULL))) {
|
||||||
|
dev_info(&adap->dev,
|
||||||
|
"Successfully instantiated SPD at 0x%hx\n",
|
||||||
|
addr_list[0]);
|
||||||
|
dimm_count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(i2c_register_spd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
|
||||||
|
MODULE_DESCRIPTION("SMBus protocol extensions support");
|
||||||
|
MODULE_LICENSE("GPL");
|
@ -0,0 +1,272 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 1998, 1999 Frodo Looijaard <frodol@dds.nl> and
|
||||||
|
* Philip Edelbrock <phil@netroedge.com>
|
||||||
|
* Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
|
||||||
|
* Copyright (C) 2003 IBM Corp.
|
||||||
|
* Copyright (C) 2004 Jean Delvare <jdelvare@suse.de>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* enable dev_dbg print out */
|
||||||
|
//#define DEBUG
|
||||||
|
|
||||||
|
#define __STDC_WANT_LIB_EXT1__ 1
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/jiffies.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
/* Addresses to scan */
|
||||||
|
static const unsigned short normal_i2c[] = { /*0x50, 0x51, 0x52, 0x53, 0x54,
|
||||||
|
0x55, 0x56, 0x57,*/ I2C_CLIENT_END };
|
||||||
|
|
||||||
|
/* Size of EEPROM in bytes */
|
||||||
|
#define EEPROM_SIZE 512
|
||||||
|
|
||||||
|
#define SLICE_BITS (6)
|
||||||
|
#define SLICE_SIZE (1 << SLICE_BITS)
|
||||||
|
#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE)
|
||||||
|
|
||||||
|
/* Each client has this additional data */
|
||||||
|
struct eeprom_data {
|
||||||
|
struct mutex update_lock;
|
||||||
|
u8 valid; /* bitfield, bit!=0 if slice is valid */
|
||||||
|
unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */
|
||||||
|
u8 data[EEPROM_SIZE]; /* Register values */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void sys_eeprom_update_client(struct i2c_client *client, u8 slice)
|
||||||
|
{
|
||||||
|
struct eeprom_data *data = i2c_get_clientdata(client);
|
||||||
|
int i, j;
|
||||||
|
int ret;
|
||||||
|
int addr;
|
||||||
|
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
|
|
||||||
|
if (!(data->valid & (1 << slice)) ||
|
||||||
|
time_after(jiffies, data->last_updated[slice] + 300 * HZ)) {
|
||||||
|
dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice);
|
||||||
|
|
||||||
|
addr = slice << SLICE_BITS;
|
||||||
|
|
||||||
|
ret = i2c_smbus_write_byte_data(client, (u8)((addr >> 8) & 0xFF), (u8)(addr & 0xFF));
|
||||||
|
/* select the eeprom address */
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(&client->dev, "address set failed\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) {
|
||||||
|
for (j = i; j < (i+SLICE_SIZE); j++) {
|
||||||
|
int res;
|
||||||
|
|
||||||
|
res = i2c_smbus_read_byte(client);
|
||||||
|
if (res < 0) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->data[j] = res & 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data->last_updated[slice] = jiffies;
|
||||||
|
data->valid |= (1 << slice);
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t sys_eeprom_read(struct file *filp, struct kobject *kobj,
|
||||||
|
struct bin_attribute *bin_attr,
|
||||||
|
char *buf, loff_t off, size_t count)
|
||||||
|
{
|
||||||
|
struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
|
||||||
|
struct eeprom_data *data = i2c_get_clientdata(client);
|
||||||
|
u8 slice;
|
||||||
|
|
||||||
|
if (off > EEPROM_SIZE) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (off + count > EEPROM_SIZE) {
|
||||||
|
count = EEPROM_SIZE - off;
|
||||||
|
}
|
||||||
|
if (count == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only refresh slices which contain requested bytes */
|
||||||
|
for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) {
|
||||||
|
sys_eeprom_update_client(client, slice);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buf, &data->data[off], count);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t sys_eeprom_write(struct file *filp, struct kobject *kobj,
|
||||||
|
struct bin_attribute *bin_attr,
|
||||||
|
char *buf, loff_t off, size_t count)
|
||||||
|
{
|
||||||
|
struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
|
||||||
|
struct eeprom_data *data = i2c_get_clientdata(client);
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
u8 cmd;
|
||||||
|
u16 value16;
|
||||||
|
|
||||||
|
dev_dbg(&client->dev, "sys_eeprom_write off=%d, count=%d\n", (int)off, (int)count);
|
||||||
|
|
||||||
|
if (off > EEPROM_SIZE) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (off + count > EEPROM_SIZE) {
|
||||||
|
count = EEPROM_SIZE - off;
|
||||||
|
}
|
||||||
|
if (count == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
|
|
||||||
|
for(i=0; i < count; i++) {
|
||||||
|
/* write command */
|
||||||
|
cmd = (off >> 8) & 0xff;
|
||||||
|
value16 = off & 0xff;
|
||||||
|
value16 |= buf[i] << 8;
|
||||||
|
ret = i2c_smbus_write_word_data(client, cmd, value16);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(&client->dev, "write address failed at %d \n", (int)off);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
off++;
|
||||||
|
|
||||||
|
/* need to wait for write complete */
|
||||||
|
udelay(10000);
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
/* force to update client when reading */
|
||||||
|
for(i=0; i < SLICE_NUM; i++) {
|
||||||
|
data->last_updated[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct bin_attribute sys_eeprom_attr = {
|
||||||
|
.attr = {
|
||||||
|
.name = "eeprom",
|
||||||
|
.mode = S_IRUGO | S_IWUSR,
|
||||||
|
},
|
||||||
|
.size = EEPROM_SIZE,
|
||||||
|
.read = sys_eeprom_read,
|
||||||
|
.write = sys_eeprom_write,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Return 0 if detection is successful, -ENODEV otherwise */
|
||||||
|
static int sys_eeprom_detect(struct i2c_client *client, struct i2c_board_info *info)
|
||||||
|
{
|
||||||
|
struct i2c_adapter *adapter = client->adapter;
|
||||||
|
|
||||||
|
/* EDID EEPROMs are often 24C00 EEPROMs, which answer to all
|
||||||
|
addresses 0x50-0x57, but we only care about 0x51 and 0x55. So decline
|
||||||
|
attaching to addresses >= 0x56 on DDC buses */
|
||||||
|
if (!(adapter->class & I2C_CLASS_SPD) && client->addr >= 0x56) {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE)
|
||||||
|
&& !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
strlcpy(info->type, "eeprom", I2C_NAME_SIZE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sys_eeprom_probe(struct i2c_client *client,
|
||||||
|
const struct i2c_device_id *id)
|
||||||
|
{
|
||||||
|
struct eeprom_data *data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __STDC_LIB_EXT1__
|
||||||
|
memset_s(data->data, EEPROM_SIZE, 0xff, EEPROM_SIZE);
|
||||||
|
#else
|
||||||
|
memset(data->data, 0xff, EEPROM_SIZE);
|
||||||
|
#endif
|
||||||
|
i2c_set_clientdata(client, data);
|
||||||
|
mutex_init(&data->update_lock);
|
||||||
|
|
||||||
|
/* create the sysfs eeprom file */
|
||||||
|
err = sysfs_create_bin_file(&client->dev.kobj, &sys_eeprom_attr);
|
||||||
|
if (err) {
|
||||||
|
goto exit_kfree;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
exit_kfree:
|
||||||
|
kfree(data);
|
||||||
|
exit:
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sys_eeprom_remove(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
sysfs_remove_bin_file(&client->dev.kobj, &sys_eeprom_attr);
|
||||||
|
kfree(i2c_get_clientdata(client));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct i2c_device_id sys_eeprom_id[] = {
|
||||||
|
{ "sys_eeprom", 0 },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_driver sys_eeprom_driver = {
|
||||||
|
.driver = {
|
||||||
|
.name = "sys_eeprom",
|
||||||
|
},
|
||||||
|
.probe = sys_eeprom_probe,
|
||||||
|
.remove = sys_eeprom_remove,
|
||||||
|
.id_table = sys_eeprom_id,
|
||||||
|
|
||||||
|
.class = I2C_CLASS_DDC | I2C_CLASS_SPD,
|
||||||
|
.detect = sys_eeprom_detect,
|
||||||
|
.address_list = normal_i2c,
|
||||||
|
};
|
||||||
|
|
||||||
|
module_i2c_driver(sys_eeprom_driver);
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Jason <jason.cy.tsai@ufispace.com>");
|
||||||
|
MODULE_DESCRIPTION("UfiSpace System EEPROM driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
@ -0,0 +1 @@
|
|||||||
|
../../../../pddf/i2c/service/pddf-platform-init.service
|
@ -0,0 +1,13 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SWSS restart service
|
||||||
|
After=swss.service
|
||||||
|
DefaultDependencies=no
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/bin/platform_swss_restart.sh
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
|
@ -0,0 +1,4 @@
|
|||||||
|
# All the derived classes for PDDF
|
||||||
|
__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"]
|
||||||
|
from . import platform
|
||||||
|
|
@ -0,0 +1,214 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# PDDF
|
||||||
|
# Module contains an implementation of SONiC Chassis API
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
from sonic_platform_pddf_base.pddf_chassis import PddfChassis
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
NUM_COMPONENT = 2
|
||||||
|
|
||||||
|
class Chassis(PddfChassis):
|
||||||
|
"""
|
||||||
|
PDDF Platform-specific Chassis class
|
||||||
|
"""
|
||||||
|
|
||||||
|
STATUS_INSERTED = "1"
|
||||||
|
STATUS_REMOVED = "0"
|
||||||
|
port_dict = {}
|
||||||
|
|
||||||
|
def __init__(self, pddf_data=None, pddf_plugin_data=None):
|
||||||
|
PddfChassis.__init__(self, pddf_data, pddf_plugin_data)
|
||||||
|
self._initialize_components()
|
||||||
|
|
||||||
|
def _initialize_components(self):
|
||||||
|
from sonic_platform.component import Component
|
||||||
|
for index in range(NUM_COMPONENT):
|
||||||
|
component = Component(index)
|
||||||
|
self._component_list.append(component)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
||||||
|
def initizalize_system_led(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_status_led(self):
|
||||||
|
return self.get_system_led("SYS_LED")
|
||||||
|
|
||||||
|
def get_system_led(self, led_device_name):
|
||||||
|
ipmi_cmd_sys_led = "ipmitool raw 0x3c 0x20 0x0"
|
||||||
|
ipmi_cmd_fantray_led = "ipmitool raw 0x3c 0x21 0x0"
|
||||||
|
|
||||||
|
led_dict = {"SYS_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_sys_led,
|
||||||
|
"index": 0},
|
||||||
|
"FAN_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_sys_led,
|
||||||
|
"index": 1},
|
||||||
|
"PSU1_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_sys_led,
|
||||||
|
"index": 2},
|
||||||
|
"PSU2_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_sys_led,
|
||||||
|
"index": 3},
|
||||||
|
"FANTRAY1_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_fantray_led,
|
||||||
|
"index": 0},
|
||||||
|
"FANTRAY2_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_fantray_led,
|
||||||
|
"index": 1},
|
||||||
|
"FANTRAY3_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_fantray_led,
|
||||||
|
"index": 2},
|
||||||
|
"FANTRAY4_LED": {
|
||||||
|
"ipmi_cmd": ipmi_cmd_fantray_led,
|
||||||
|
"index": 3}
|
||||||
|
}
|
||||||
|
color_dict = {0: "off",
|
||||||
|
1: "yellow",
|
||||||
|
2: "green"}
|
||||||
|
|
||||||
|
if led_device_name not in led_dict.keys():
|
||||||
|
status = "[FAILED] " + led_device_name + " is not configured"
|
||||||
|
return (status)
|
||||||
|
|
||||||
|
ipmi_cmd = led_dict[led_device_name]["ipmi_cmd"]
|
||||||
|
index = led_dict[led_device_name]["index"]
|
||||||
|
status, output = subprocess.getstatusoutput(ipmi_cmd)
|
||||||
|
|
||||||
|
if status != 0:
|
||||||
|
return ("ipmi_cmd error, cmd={}, status={}".format(ipmi_cmd, status))
|
||||||
|
|
||||||
|
color_raw = int(output.split()[index])
|
||||||
|
|
||||||
|
if color_raw not in color_dict.keys():
|
||||||
|
color = "unknown"
|
||||||
|
else:
|
||||||
|
color = color_dict[color_raw]
|
||||||
|
|
||||||
|
return (color)
|
||||||
|
|
||||||
|
def get_change_event(self, timeout=0):
|
||||||
|
"""
|
||||||
|
Returns a nested dictionary containing all devices which have
|
||||||
|
experienced a change at chassis level
|
||||||
|
Args:
|
||||||
|
timeout: Timeout in milliseconds (optional). If timeout == 0,
|
||||||
|
this method will block until a change is detected.
|
||||||
|
Returns:
|
||||||
|
(bool, dict):
|
||||||
|
- bool: True if call successful, False if not;
|
||||||
|
- dict: A nested dictionary where key is a device type,
|
||||||
|
value is a dictionary with key:value pairs in the format of
|
||||||
|
{'device_id':'device_event'}, where device_id is the device ID
|
||||||
|
for this device and device_event.
|
||||||
|
The known devices's device_id and device_event was defined as table below.
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
device | device_id | device_event | annotate
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
'fan' '<fan number>' '0' Fan removed
|
||||||
|
'1' Fan inserted
|
||||||
|
'sfp' '<sfp number>' '0' Sfp removed
|
||||||
|
'1' Sfp inserted
|
||||||
|
'2' I2C bus stuck
|
||||||
|
'3' Bad eeprom
|
||||||
|
'4' Unsupported cable
|
||||||
|
'5' High Temperature
|
||||||
|
'6' Bad cable
|
||||||
|
'voltage' '<monitor point>' '0' Vout normal
|
||||||
|
'1' Vout abnormal
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'},
|
||||||
|
'voltage':{'U20':'0', 'U21':'1'}}
|
||||||
|
Indicates that:
|
||||||
|
fan 0 has been removed, fan 2 has been inserted.
|
||||||
|
sfp 11 has been removed, sfp 12 has been inserted.
|
||||||
|
monitored voltage U20 became normal, voltage U21 became abnormal.
|
||||||
|
Note: For sfp, when event 3-6 happened, the module will not be avalaible,
|
||||||
|
XCVRD shall stop to read eeprom before SFP recovered from error status.
|
||||||
|
"""
|
||||||
|
|
||||||
|
change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}}
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
forever = False
|
||||||
|
|
||||||
|
if timeout == 0:
|
||||||
|
forever = True
|
||||||
|
elif timeout > 0:
|
||||||
|
timeout = timeout / float(1000) # Convert to secs
|
||||||
|
else:
|
||||||
|
print("get_change_event:Invalid timeout value", timeout)
|
||||||
|
return False, change_event_dict
|
||||||
|
|
||||||
|
end_time = start_time + timeout
|
||||||
|
if start_time > end_time:
|
||||||
|
print(
|
||||||
|
"get_change_event:" "time wrap / invalid timeout value",
|
||||||
|
timeout,
|
||||||
|
)
|
||||||
|
return False, change_event_dict # Time wrap or possibly incorrect timeout
|
||||||
|
try:
|
||||||
|
while timeout >= 0:
|
||||||
|
# check for sfp
|
||||||
|
sfp_change_dict = self.get_transceiver_change_event()
|
||||||
|
# check for fan
|
||||||
|
# fan_change_dict = self.get_fan_change_event()
|
||||||
|
# check for voltage
|
||||||
|
# voltage_change_dict = self.get_voltage_change_event()
|
||||||
|
|
||||||
|
if sfp_change_dict:
|
||||||
|
change_event_dict["sfp"] = sfp_change_dict
|
||||||
|
# change_event_dict["fan"] = fan_change_dict
|
||||||
|
# change_event_dict["voltage"] = voltage_change_dict
|
||||||
|
return True, change_event_dict
|
||||||
|
if forever:
|
||||||
|
time.sleep(1)
|
||||||
|
else:
|
||||||
|
timeout = end_time - time.time()
|
||||||
|
if timeout >= 1:
|
||||||
|
time.sleep(1) # We poll at 1 second granularity
|
||||||
|
else:
|
||||||
|
if timeout > 0:
|
||||||
|
time.sleep(timeout)
|
||||||
|
return True, change_event_dict
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
print("get_change_event: Should not reach here.")
|
||||||
|
return False, change_event_dict
|
||||||
|
|
||||||
|
def get_transceiver_change_event(self):
|
||||||
|
current_port_dict = {}
|
||||||
|
ret_dict = {}
|
||||||
|
|
||||||
|
# Check for OIR events and return ret_dict
|
||||||
|
for index in range(self.platform_inventory['num_ports']):
|
||||||
|
if self._sfp_list[index].get_presence():
|
||||||
|
current_port_dict[index] = self.STATUS_INSERTED
|
||||||
|
else:
|
||||||
|
current_port_dict[index] = self.STATUS_REMOVED
|
||||||
|
|
||||||
|
if len(self.port_dict) == 0: # first time
|
||||||
|
self.port_dict = current_port_dict
|
||||||
|
return {}
|
||||||
|
|
||||||
|
if current_port_dict == self.port_dict:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
# Update reg value
|
||||||
|
for index, status in current_port_dict.items():
|
||||||
|
if self.port_dict[index] != status:
|
||||||
|
ret_dict[index] = status
|
||||||
|
#ret_dict[str(index)] = status
|
||||||
|
self.port_dict = current_port_dict
|
||||||
|
for index, status in ret_dict.items():
|
||||||
|
if int(status) == 1:
|
||||||
|
pass
|
||||||
|
#self._sfp_list[int(index)].check_sfp_optoe_type()
|
||||||
|
return ret_dict
|
@ -0,0 +1,113 @@
|
|||||||
|
#############################################################################
|
||||||
|
#
|
||||||
|
# Component contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the components firmware management function
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
import subprocess
|
||||||
|
from sonic_platform_base.component_base import ComponentBase
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
BMC_CMDS = {
|
||||||
|
"VER1": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f1",
|
||||||
|
"VER2": "ipmitool mc info | grep 'Firmware Revision' | cut -d':' -f2 | cut -d'.' -f2",
|
||||||
|
"VER3": "echo $((`ipmitool mc info | grep 'Aux Firmware Rev Info' -A 2 | sed -n '2p'` + 0))",
|
||||||
|
}
|
||||||
|
|
||||||
|
BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version"
|
||||||
|
COMPONENT_LIST= [
|
||||||
|
("BIOS", "Basic Input/Output System"),
|
||||||
|
("BMC", "BMC"),
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
class Component(ComponentBase):
|
||||||
|
"""Platform-specific Component class"""
|
||||||
|
|
||||||
|
DEVICE_TYPE = "component"
|
||||||
|
|
||||||
|
def __init__(self, component_index=0):
|
||||||
|
self.index = component_index
|
||||||
|
self.name = self.get_name()
|
||||||
|
|
||||||
|
def _run_command(self, command):
|
||||||
|
# Run bash command and print output to stdout
|
||||||
|
try:
|
||||||
|
process = subprocess.Popen(
|
||||||
|
shlex.split(command), stdout=subprocess.PIPE)
|
||||||
|
while True:
|
||||||
|
output = process.stdout.readline()
|
||||||
|
if output == '' and process.poll() is not None:
|
||||||
|
break
|
||||||
|
rc = process.poll()
|
||||||
|
if rc != 0:
|
||||||
|
return False
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _get_bios_version(self):
|
||||||
|
# Retrieves the BIOS firmware version
|
||||||
|
try:
|
||||||
|
with open(BIOS_VERSION_PATH, 'r') as fd:
|
||||||
|
bios_version = fd.read()
|
||||||
|
return bios_version.strip()
|
||||||
|
except Exception as e:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _get_bmc_version(self):
|
||||||
|
# Retrieves the BMC firmware version
|
||||||
|
bmc_ver = dict()
|
||||||
|
for ver in BMC_CMDS:
|
||||||
|
status, value = subprocess.getstatusoutput(BMC_CMDS[ver])
|
||||||
|
if not status:
|
||||||
|
bmc_ver[ver] = int(value.rstrip())
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
bmc_version = "{}.{}.{}".format(bmc_ver["VER1"], bmc_ver["VER2"], bmc_ver["VER3"])
|
||||||
|
|
||||||
|
return bmc_version
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
"""
|
||||||
|
Retrieves the name of the component
|
||||||
|
Returns:
|
||||||
|
A string containing the name of the component
|
||||||
|
"""
|
||||||
|
return COMPONENT_LIST[self.index][0]
|
||||||
|
|
||||||
|
def get_description(self):
|
||||||
|
"""
|
||||||
|
Retrieves the description of the component
|
||||||
|
Returns:
|
||||||
|
A string containing the description of the component
|
||||||
|
"""
|
||||||
|
return COMPONENT_LIST[self.index][1]
|
||||||
|
|
||||||
|
def get_firmware_version(self):
|
||||||
|
"""
|
||||||
|
Retrieves the firmware version of module
|
||||||
|
Returns:
|
||||||
|
string: The firmware versions of the module
|
||||||
|
"""
|
||||||
|
fw_version = None
|
||||||
|
|
||||||
|
if self.name == "BIOS":
|
||||||
|
fw_version = self._get_bios_version()
|
||||||
|
elif self.name == "BMC":
|
||||||
|
fw_version = self._get_bmc_version()
|
||||||
|
return fw_version
|
||||||
|
|
||||||
|
def install_firmware(self, image_path):
|
||||||
|
"""
|
||||||
|
Install firmware to module
|
||||||
|
Args:
|
||||||
|
image_path: A string, path to firmware image
|
||||||
|
Returns:
|
||||||
|
A boolean, True if install successfully, False if not
|
||||||
|
"""
|
||||||
|
raise NotImplementedError
|
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Eeprom(PddfEeprom):
|
||||||
|
|
||||||
|
def __init__(self, pddf_data=None, pddf_plugin_data=None):
|
||||||
|
PddfEeprom.__init__(self, pddf_data, pddf_plugin_data)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
@ -0,0 +1,147 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_fan import PddfFan
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Fan(PddfFan):
|
||||||
|
"""PDDF Platform-Specific Fan class"""
|
||||||
|
|
||||||
|
def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0):
|
||||||
|
# idx is 0-based
|
||||||
|
PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
||||||
|
# Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake'
|
||||||
|
|
||||||
|
def get_speed(self):
|
||||||
|
"""
|
||||||
|
Retrieves the speed of fan as a percentage of full speed
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An integer, the percentage of full fan speed, in the range 0 (off)
|
||||||
|
to 100 (full speed)
|
||||||
|
"""
|
||||||
|
speed_percentage = 0
|
||||||
|
if self.is_psu_fan:
|
||||||
|
attr = "psu_fan{}_speed_rpm".format(self.fan_index)
|
||||||
|
device = "PSU{}".format(self.fans_psu_index)
|
||||||
|
max_speed = int(self.plugin_data['PSU']['PSU_FAN_MAX_SPEED'])
|
||||||
|
else:
|
||||||
|
if self.fan_index == 1:
|
||||||
|
pos = "f"
|
||||||
|
max_speed = int(self.plugin_data['FAN']['FAN_F_MAX_SPEED'])
|
||||||
|
else:
|
||||||
|
pos = "r"
|
||||||
|
max_speed = int(self.plugin_data['FAN']['FAN_R_MAX_SPEED'])
|
||||||
|
attr = "fan{}_{}_speed_rpm".format(self.fantray_index, pos)
|
||||||
|
device = "FAN-CTRL"
|
||||||
|
|
||||||
|
output = self.pddf_obj.get_attr_name_output(device, attr)
|
||||||
|
if not output:
|
||||||
|
return speed_percentage
|
||||||
|
|
||||||
|
output['status'] = output['status'].rstrip()
|
||||||
|
if output['status'].isalpha():
|
||||||
|
return speed_percentage
|
||||||
|
else:
|
||||||
|
speed = int(float(output['status']))
|
||||||
|
|
||||||
|
speed_percentage = round((speed*100)/max_speed)
|
||||||
|
|
||||||
|
return min(speed_percentage, 100)
|
||||||
|
|
||||||
|
def get_speed_rpm(self):
|
||||||
|
"""
|
||||||
|
Retrieves the speed of fan in RPM
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
An integer, Speed of fan in RPM
|
||||||
|
"""
|
||||||
|
rpm_speed = 0
|
||||||
|
if self.is_psu_fan:
|
||||||
|
attr = "psu_fan{}_speed_rpm".format(self.fan_index)
|
||||||
|
device = "PSU{}".format(self.fans_psu_index)
|
||||||
|
else:
|
||||||
|
if self.fan_index == 1:
|
||||||
|
pos = "f"
|
||||||
|
else:
|
||||||
|
pos = "r"
|
||||||
|
attr = "fan{}_{}_speed_rpm".format(self.fantray_index, pos)
|
||||||
|
device = "FAN-CTRL"
|
||||||
|
|
||||||
|
output = self.pddf_obj.get_attr_name_output(device, attr)
|
||||||
|
|
||||||
|
if output is None:
|
||||||
|
return rpm_speed
|
||||||
|
|
||||||
|
output['status'] = output['status'].rstrip()
|
||||||
|
if output['status'].isalpha():
|
||||||
|
return rpm_speed
|
||||||
|
else:
|
||||||
|
rpm_speed = int(float(output['status']))
|
||||||
|
|
||||||
|
return rpm_speed
|
||||||
|
|
||||||
|
def get_direction(self):
|
||||||
|
"""
|
||||||
|
Retrieves the direction of fan
|
||||||
|
Returns:
|
||||||
|
A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST
|
||||||
|
depending on fan direction
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self.FAN_DIRECTION_EXHAUST
|
||||||
|
|
||||||
|
def get_presence(self):
|
||||||
|
"""
|
||||||
|
Retrieves the presence of the device
|
||||||
|
Returns:
|
||||||
|
bool: True if device is present, False if not
|
||||||
|
"""
|
||||||
|
presence = False
|
||||||
|
if self.is_psu_fan:
|
||||||
|
attr = "psu_present"
|
||||||
|
device = "PSU{}".format(self.fans_psu_index)
|
||||||
|
else:
|
||||||
|
attr = "fan{}_present".format(self.fantray_index)
|
||||||
|
device = "FAN-CTRL"
|
||||||
|
|
||||||
|
output = self.pddf_obj.get_attr_name_output(device, attr)
|
||||||
|
if not output:
|
||||||
|
return presence
|
||||||
|
|
||||||
|
|
||||||
|
mode = output['mode']
|
||||||
|
val = output['status'].strip()
|
||||||
|
vmap = self.plugin_data['FAN']['present'][mode]['valmap']
|
||||||
|
|
||||||
|
if val in vmap:
|
||||||
|
presence = vmap[val]
|
||||||
|
|
||||||
|
return presence
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
"""
|
||||||
|
Retrieves the operational status of the device
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A boolean value, True if device is operating properly, False if not
|
||||||
|
"""
|
||||||
|
speed = self.get_speed_rpm()
|
||||||
|
status = True if (speed != 0) else False
|
||||||
|
return status
|
||||||
|
|
||||||
|
def get_target_speed(self):
|
||||||
|
"""
|
||||||
|
Retrieves the target (expected) speed of the fan
|
||||||
|
Returns:
|
||||||
|
An integer, the percentage of full fan speed, in the range 0 (off)
|
||||||
|
to 100 (full speed)
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self.get_speed()
|
||||||
|
|
@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class FanDrawer(PddfFanDrawer):
|
||||||
|
"""PDDF Platform-Specific Fan-Drawer class"""
|
||||||
|
|
||||||
|
def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None):
|
||||||
|
# idx is 0-based
|
||||||
|
PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# PDDF
|
||||||
|
# Module contains an implementation of SONiC Platform Base API and
|
||||||
|
# provides the platform information
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_platform import PddfPlatform
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Platform(PddfPlatform):
|
||||||
|
"""
|
||||||
|
PDDF Platform-Specific Platform Class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
PddfPlatform.__init__(self)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_psu import PddfPsu
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError (str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Psu(PddfPsu):
|
||||||
|
"""PDDF Platform-Specific PSU class"""
|
||||||
|
|
||||||
|
PLATFORM_PSU_CAPACITY = 550
|
||||||
|
|
||||||
|
def __init__(self, index, pddf_data=None, pddf_plugin_data=None):
|
||||||
|
PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
||||||
|
def get_maximum_supplied_power(self):
|
||||||
|
"""
|
||||||
|
Retrieves the maximum supplied power by PSU (or PSU capacity)
|
||||||
|
Returns:
|
||||||
|
A float number, the maximum power output in Watts.
|
||||||
|
e.g. 1200.1
|
||||||
|
"""
|
||||||
|
return float(self.PLATFORM_PSU_CAPACITY)
|
||||||
|
|
||||||
|
def get_power(self):
|
||||||
|
"""
|
||||||
|
Retrieves current energy supplied by PSU
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A float number, the power in watts,
|
||||||
|
e.g. 302.6
|
||||||
|
"""
|
||||||
|
|
||||||
|
# power is returned in micro watts
|
||||||
|
return float(self.get_voltage()*self.get_current())
|
@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_sfp import PddfSfp
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError (str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
class Sfp(PddfSfp):
|
||||||
|
"""
|
||||||
|
PDDF Platform-Specific Sfp class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, index, pddf_data=None, pddf_plugin_data=None):
|
||||||
|
PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_thermal import PddfThermal
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Thermal(PddfThermal):
|
||||||
|
"""PDDF Platform-Specific Thermal class"""
|
||||||
|
|
||||||
|
def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0):
|
||||||
|
PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index)
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
#
|
||||||
|
# Module contains an implementation of platform specific watchdog API's
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
try:
|
||||||
|
from sonic_platform_pddf_base.pddf_watchdog import PddfWatchdog
|
||||||
|
except ImportError as e:
|
||||||
|
raise ImportError(str(e) + "- required module not found")
|
||||||
|
|
||||||
|
class Watchdog(PddfWatchdog):
|
||||||
|
"""
|
||||||
|
PDDF Platform-specific Chassis class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
PddfWatchdog.__init__(self)
|
||||||
|
self.timeout= 180
|
||||||
|
|
||||||
|
# Provide the functions/variables below for which implementation is to be overwritten
|
@ -0,0 +1,27 @@
|
|||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='sonic-platform',
|
||||||
|
version='1.0',
|
||||||
|
description='SONiC platform API implementation on ufispace platform',
|
||||||
|
license='Apache 2.0',
|
||||||
|
author='SONiC Team',
|
||||||
|
author_email='linuxnetdev@microsoft.com',
|
||||||
|
url='https://github.com/Azure/sonic-buildimage',
|
||||||
|
maintainer='Leo Lin',
|
||||||
|
maintainer_email='leo.yt.lin@ufispace.com',
|
||||||
|
packages=['sonic_platform'],
|
||||||
|
classifiers=[
|
||||||
|
'Development Status :: 3 - Alpha',
|
||||||
|
'Environment :: Plugins',
|
||||||
|
'Intended Audience :: Developers',
|
||||||
|
'Intended Audience :: Information Technology',
|
||||||
|
'Intended Audience :: System Administrators',
|
||||||
|
'License :: OSI Approved :: Apache Software License',
|
||||||
|
'Natural Language :: English',
|
||||||
|
'Operating System :: POSIX :: Linux',
|
||||||
|
'Programming Language :: Python :: 3.7',
|
||||||
|
'Topic :: Utilities',
|
||||||
|
],
|
||||||
|
keywords='sonic SONiC platform PLATFORM',
|
||||||
|
)
|
@ -0,0 +1,93 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# init Host GPIO 0x74
|
||||||
|
i2cset -f -y -r 0 0x74 4 0x00
|
||||||
|
i2cset -f -y -r 0 0x74 5 0x00
|
||||||
|
i2cset -f -y -r 0 0x74 2 0x0F
|
||||||
|
i2cset -f -y -r 0 0x74 3 0xDF
|
||||||
|
i2cset -f -y -r 0 0x74 6 0x08
|
||||||
|
i2cset -f -y -r 0 0x74 7 0x1F
|
||||||
|
|
||||||
|
gpio_base=511
|
||||||
|
|
||||||
|
# gpio sysfs active_low - ABS Port 0-31
|
||||||
|
# gpio 480-511
|
||||||
|
start=$((gpio_base-31))
|
||||||
|
end=$gpio_base
|
||||||
|
for (( i=$start; i<=$end; i++ ))
|
||||||
|
do
|
||||||
|
echo 1 > /sys/class/gpio/gpio${i}/active_low
|
||||||
|
done
|
||||||
|
|
||||||
|
# gpio sysfs active_low - Intr Port 0-31
|
||||||
|
# gpio 448-479
|
||||||
|
start=$((gpio_base-63))
|
||||||
|
end=$((gpio_base-32))
|
||||||
|
for (( i=$start; i<=$end; i++ ))
|
||||||
|
do
|
||||||
|
echo 1 > /sys/class/gpio/gpio${i}/active_low
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# gpio sysfs active_low - SFP Port
|
||||||
|
# gpio 432-447
|
||||||
|
sfp_active_low_array=(1 1 1 1 0 0 1 1 \
|
||||||
|
0 0 0 0 1 1 1 1)
|
||||||
|
start=$((gpio_base-79))
|
||||||
|
end=$((gpio_base-64))
|
||||||
|
for (( i=$start; i<=$end; i++ ))
|
||||||
|
do
|
||||||
|
echo ${sfp_active_low_array[$((i-start))]} > /sys/class/gpio/gpio${i}/active_low
|
||||||
|
done
|
||||||
|
|
||||||
|
# gpio sysfs active_low - LP Mode Mode Port 0-31
|
||||||
|
# gpio 400-431
|
||||||
|
start=$((gpio_base-111))
|
||||||
|
end=$((gpio_base-80))
|
||||||
|
for (( i=$start; i<=$end; i++ ))
|
||||||
|
do
|
||||||
|
echo 0 > /sys/class/gpio/gpio${i}/active_low
|
||||||
|
done
|
||||||
|
|
||||||
|
# gpio sysfs active_low - RST Mode Port 0-31
|
||||||
|
# gpio 368-399
|
||||||
|
start=$((gpio_base-143))
|
||||||
|
end=$((gpio_base-112))
|
||||||
|
for (( i=$start; i<=$end; i++ ))
|
||||||
|
do
|
||||||
|
echo 1 > /sys/class/gpio/gpio${i}/active_low
|
||||||
|
echo 0 > /sys/class/gpio/gpio${i}/value
|
||||||
|
done
|
||||||
|
|
||||||
|
# init QSFP port name
|
||||||
|
qsfp_bus_array=(10 9 12 11 14 13 16 15 18 17 \
|
||||||
|
20 19 22 21 24 23 26 25 28 27 \
|
||||||
|
30 29 32 31 34 33 36 35 38 37 \
|
||||||
|
40 39)
|
||||||
|
for i in {0..31};
|
||||||
|
do
|
||||||
|
echo $((i + 1)) > /sys/bus/i2c/devices/${qsfp_bus_array[i]}-0050/port_name
|
||||||
|
#echo "echo $((i + 1)) > /sys/bus/i2c/devices/${qsfp_bus_array[i]}-0050/port_name"
|
||||||
|
done
|
||||||
|
|
||||||
|
# init SFP port name
|
||||||
|
sfp_bus_array=(45 46)
|
||||||
|
for i in {0..1};
|
||||||
|
do
|
||||||
|
echo $((i + 33)) > /sys/bus/i2c/devices/${sfp_bus_array[i]}-0050/port_name
|
||||||
|
done
|
||||||
|
|
||||||
|
# _mac_vdd_init
|
||||||
|
# vid to mac vdd value mapping
|
||||||
|
vdd_val_array=( 0.85 0.82 0.77 0.87 0.74 0.84 0.79 0.89 )
|
||||||
|
# vid to rov reg value mapping
|
||||||
|
rov_reg_array=( 0x24 0x21 0x1C 0x26 0x19 0x23 0x1E 0x28 )
|
||||||
|
|
||||||
|
reg_val=$(eval "i2cget -f -y 44 0x33 0x42 2>/dev/null")
|
||||||
|
vid=$(($reg_val & 0x7))
|
||||||
|
mac_vdd_val=${vdd_val_array[vid]}
|
||||||
|
rov_reg=${rov_reg_array[vid]}
|
||||||
|
i2cset -f -y -r 8 0x22 0x21 ${rov_reg} w 2>/dev/null
|
||||||
|
|
||||||
|
echo "PDDF device post-create completed"
|
||||||
|
|
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "PDDF driver post-install completed"
|
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#rmmod gpio_ich
|
||||||
|
modprobe -rq i2c_i801
|
||||||
|
modprobe -rq i2c_smbus
|
||||||
|
echo "PDDF driver pre-install completed"
|
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# Script to stop and start the respective platforms default services.
|
||||||
|
# This will be used while switching the pddf->non-pddf mode and vice versa
|
||||||
|
import commands
|
||||||
|
|
||||||
|
def check_pddf_support():
|
||||||
|
return True
|
||||||
|
|
||||||
|
def stop_platform_svc():
|
||||||
|
|
||||||
|
'''
|
||||||
|
status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py deinit")
|
||||||
|
if status:
|
||||||
|
print "platform_utility.py deinit command failed %d"%status
|
||||||
|
return False
|
||||||
|
'''
|
||||||
|
|
||||||
|
# HACK , stop the pddf-platform-init service if it is active
|
||||||
|
status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service")
|
||||||
|
if status:
|
||||||
|
print "Stop pddf-platform-init.service along with other platform serives failed %d"%status
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def start_platform_svc():
|
||||||
|
|
||||||
|
'''
|
||||||
|
status, output = commands.getstatusoutput("/usr/local/bin/platform_utility.py init")
|
||||||
|
if status:
|
||||||
|
print "platform_utility.py init command failed %d"%status
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
'''
|
||||||
|
return True
|
||||||
|
|
||||||
|
def start_platform_pddf():
|
||||||
|
|
||||||
|
status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service")
|
||||||
|
if status:
|
||||||
|
print "Start pddf-platform-init.service failed %d"%status
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def stop_platform_pddf():
|
||||||
|
|
||||||
|
status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service")
|
||||||
|
if status:
|
||||||
|
print "Stop pddf-platform-init.service failed %d"%status
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
service swss restart
|
||||||
|
echo "SWSS service restarted"
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#rmmod gpio_ich
|
||||||
|
modprobe -rq i2c_i801
|
||||||
|
modprobe -rq i2c_smbus
|
||||||
|
echo "Pre PDDF init steps completed successully"
|
Loading…
Reference in New Issue
Block a user