[Quanta] Add a new supported device and platform, IX7-32X, IX8-56X (#3297)

Switch Vendor: Quanta
Switch SKU: IX7-32X
CPU: Intel C2558
ASIC Vendor: Broadcom
Switch ASIC: Trident3, BCM56870
Port Configuration: 32x100G

Switch Vendor: Quanta
Switch SKU: IX8-56X
CPU: Intel C2558
ASIC Vendor: Broadcom
Switch ASIC: Trident3, BCM56873
Port Configuration: 48x25G + 8x100G

Signed-off-by: Jonathan Tsai <jonathan.tsai@quantatw.com>
This commit is contained in:
Jonathan Tsai 2019-08-08 16:11:29 +08:00 committed by lguohan
parent fe6664b1bb
commit 2ff8f5d1b9
39 changed files with 4426 additions and 1 deletions

View File

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

View File

@ -0,0 +1 @@
SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-ix7-32x100G.config.bcm

View File

@ -0,0 +1,534 @@
bcm_tunnel_term_compatible_mode=1
core_clock_frequency=1525
dpp_clock_ratio=2:3
parity_enable=0
mem_cache_enable=0
l2_mem_entries=40960
l3_mem_entries=40960
fpem_mem_entries=16384
l2xmsg_mode=1
bcm_num_cos=8
bcm_stat_interval=2000000
cdma_timeout_usec=3000000
ifp_inports_support_enable=1
ipv6_lpm_128b_enable=0x1
l3_max_ecmp_mode=1
l3_alpm_enable=2
lpm_scaling_enable=0
miim_intr_enable=0
module_64ports=1
schan_intr_enable=0
skip_L2_USER_ENTRY=0
stable_size=0x5500000
tdma_timeout_usec=3000000
# portmap settings
oversubscribe_mode=1
pbmp_xport_xe=0x4888888888888888c2222222222222222
port_flex_enable=1
portmap_1=1:100
portmap_5=5:100
portmap_9=9:100
portmap_13=13:100
portmap_17=17:100
portmap_21=21:100
portmap_25=25:100
portmap_29=29:100
portmap_33=33:100
portmap_37=37:100
portmap_41=41:100
portmap_45=45:100
portmap_49=49:100
portmap_53=53:100
portmap_57=57:100
portmap_61=61:100
portmap_67=65:100
portmap_71=69:100
portmap_75=73:100
portmap_79=77:100
portmap_83=81:100
portmap_87=85:100
portmap_91=89:100
portmap_95=93:100
portmap_99=97:100
portmap_103=101:100
portmap_107=105:100
portmap_111=109:100
portmap_115=113:100
portmap_119=117:100
portmap_123=121:100
portmap_127=125:100
# datapath port -- merlin core
portmap_66=129:10:m
portmap_130=128:10:m
# loopback port
portmap_65=130:10
portmap_131=131:10
# port order remap
dport_map_port_29=1
dport_map_port_33=2
dport_map_port_41=3
dport_map_port_45=4
dport_map_port_1=5
dport_map_port_5=6
dport_map_port_9=7
dport_map_port_13=8
dport_map_port_17=9
dport_map_port_21=10
dport_map_port_25=11
dport_map_port_37=12
dport_map_port_49=13
dport_map_port_53=14
dport_map_port_57=15
dport_map_port_61=16
dport_map_port_67=17
dport_map_port_71=18
dport_map_port_75=19
dport_map_port_79=20
dport_map_port_95=21
dport_map_port_103=22
dport_map_port_107=23
dport_map_port_111=24
dport_map_port_115=25
dport_map_port_119=26
dport_map_port_123=27
dport_map_port_127=28
dport_map_port_83=29
dport_map_port_87=30
dport_map_port_91=31
dport_map_port_99=32
dport_map_port_66=33
dport_map_port_130=34
### interface setting
# TSCF / TSCE interface definition
# NULL 1
# GMII 3
# SGMII 4
# XGMII 6
# SFI 9
# XFI 10
# KR 11
# KR4 12
# CR 13
# CR4 14
# XLAUI 15
# SR 16
# ILKN 21
# CAUI 25
# LR 26
# LR4 27
# SR4 28
# SR2 38
# KR2 39
# CR2 40
# XLAUI2 42
# LR2 55
# CAUI4 62
###
serdes_if_type_29=14
serdes_if_type_33=14
serdes_if_type_41=14
serdes_if_type_45=14
serdes_if_type_1=14
serdes_if_type_5=14
serdes_if_type_9=14
serdes_if_type_13=14
serdes_if_type_17=14
serdes_if_type_21=14
serdes_if_type_25=14
serdes_if_type_37=14
serdes_if_type_49=14
serdes_if_type_53=14
serdes_if_type_57=14
serdes_if_type_61=14
serdes_if_type_67=14
serdes_if_type_71=14
serdes_if_type_75=14
serdes_if_type_79=14
serdes_if_type_95=14
serdes_if_type_103=14
serdes_if_type_107=14
serdes_if_type_111=14
serdes_if_type_115=14
serdes_if_type_119=14
serdes_if_type_123=14
serdes_if_type_127=14
serdes_if_type_83=14
serdes_if_type_87=14
serdes_if_type_91=14
serdes_if_type_99=14
serdes_if_type_66=11
serdes_if_type_130=11
### lane swap and polarity follow physical port
phy_chain_tx_lane_map_physical{29.0}=0x1230
phy_chain_tx_polarity_flip_physical{29.0}=0x1
phy_chain_tx_polarity_flip_physical{30.0}=0x0
phy_chain_tx_polarity_flip_physical{31.0}=0x1
phy_chain_tx_polarity_flip_physical{32.0}=0x1
phy_chain_rx_lane_map_physical{29.0}=0x1302
phy_chain_rx_polarity_flip_physical{29.0}=0x0
phy_chain_rx_polarity_flip_physical{30.0}=0x0
phy_chain_rx_polarity_flip_physical{31.0}=0x1
phy_chain_rx_polarity_flip_physical{32.0}=0x1
phy_chain_tx_lane_map_physical{33.0}=0x3210
phy_chain_tx_polarity_flip_physical{33.0}=0x1
phy_chain_tx_polarity_flip_physical{34.0}=0x1
phy_chain_tx_polarity_flip_physical{35.0}=0x1
phy_chain_tx_polarity_flip_physical{36.0}=0x1
phy_chain_rx_lane_map_physical{33.0}=0x0123
phy_chain_rx_polarity_flip_physical{33.0}=0x0
phy_chain_rx_polarity_flip_physical{34.0}=0x1
phy_chain_rx_polarity_flip_physical{35.0}=0x0
phy_chain_rx_polarity_flip_physical{36.0}=0x1
phy_chain_tx_lane_map_physical{41.0}=0x0213
phy_chain_tx_polarity_flip_physical{41.0}=0x0
phy_chain_tx_polarity_flip_physical{42.0}=0x1
phy_chain_tx_polarity_flip_physical{43.0}=0x1
phy_chain_tx_polarity_flip_physical{44.0}=0x0
phy_chain_rx_lane_map_physical{41.0}=0x1302
phy_chain_rx_polarity_flip_physical{41.0}=0x1
phy_chain_rx_polarity_flip_physical{42.0}=0x1
phy_chain_rx_polarity_flip_physical{43.0}=0x0
phy_chain_rx_polarity_flip_physical{44.0}=0x0
phy_chain_tx_lane_map_physical{45.0}=0x3210
phy_chain_tx_polarity_flip_physical{45.0}=0x1
phy_chain_tx_polarity_flip_physical{46.0}=0x1
phy_chain_tx_polarity_flip_physical{47.0}=0x1
phy_chain_tx_polarity_flip_physical{48.0}=0x1
phy_chain_rx_lane_map_physical{45.0}=0x2103
phy_chain_rx_polarity_flip_physical{45.0}=0x0
phy_chain_rx_polarity_flip_physical{46.0}=0x0
phy_chain_rx_polarity_flip_physical{47.0}=0x1
phy_chain_rx_polarity_flip_physical{48.0}=0x0
phy_chain_tx_lane_map_physical{1.0}=0x0213
phy_chain_tx_polarity_flip_physical{1.0}=0x0
phy_chain_tx_polarity_flip_physical{2.0}=0x1
phy_chain_tx_polarity_flip_physical{3.0}=0x1
phy_chain_tx_polarity_flip_physical{4.0}=0x0
phy_chain_rx_lane_map_physical{1.0}=0x1302
phy_chain_rx_polarity_flip_physical{1.0}=0x0
phy_chain_rx_polarity_flip_physical{2.0}=0x0
phy_chain_rx_polarity_flip_physical{3.0}=0x1
phy_chain_rx_polarity_flip_physical{4.0}=0x1
phy_chain_tx_lane_map_physical{5.0}=0x3210
phy_chain_tx_polarity_flip_physical{5.0}=0x1
phy_chain_tx_polarity_flip_physical{6.0}=0x1
phy_chain_tx_polarity_flip_physical{7.0}=0x1
phy_chain_tx_polarity_flip_physical{8.0}=0x1
phy_chain_rx_lane_map_physical{5.0}=0x2103
phy_chain_rx_polarity_flip_physical{5.0}=0x1
phy_chain_rx_polarity_flip_physical{6.0}=0x1
phy_chain_rx_polarity_flip_physical{7.0}=0x0
phy_chain_rx_polarity_flip_physical{8.0}=0x1
phy_chain_tx_lane_map_physical{9.0}=0x0213
phy_chain_tx_polarity_flip_physical{9.0}=0x0
phy_chain_tx_polarity_flip_physical{10.0}=0x1
phy_chain_tx_polarity_flip_physical{11.0}=0x1
phy_chain_tx_polarity_flip_physical{12.0}=0x0
phy_chain_rx_lane_map_physical{9.0}=0x1302
phy_chain_rx_polarity_flip_physical{9.0}=0x0
phy_chain_rx_polarity_flip_physical{10.0}=0x1
phy_chain_rx_polarity_flip_physical{11.0}=0x1
phy_chain_rx_polarity_flip_physical{12.0}=0x1
phy_chain_tx_lane_map_physical{13.0}=0x3210
phy_chain_tx_polarity_flip_physical{13.0}=0x1
phy_chain_tx_polarity_flip_physical{14.0}=0x1
phy_chain_tx_polarity_flip_physical{15.0}=0x1
phy_chain_tx_polarity_flip_physical{16.0}=0x1
phy_chain_rx_lane_map_physical{13.0}=0x2031
phy_chain_rx_polarity_flip_physical{13.0}=0x1
phy_chain_rx_polarity_flip_physical{14.0}=0x0
phy_chain_rx_polarity_flip_physical{15.0}=0x1
phy_chain_rx_polarity_flip_physical{16.0}=0x1
phy_chain_tx_lane_map_physical{17.0}=0x0123
phy_chain_tx_polarity_flip_physical{17.0}=0x0
phy_chain_tx_polarity_flip_physical{18.0}=0x0
phy_chain_tx_polarity_flip_physical{19.0}=0x1
phy_chain_tx_polarity_flip_physical{20.0}=0x1
phy_chain_rx_lane_map_physical{17.0}=0x1302
phy_chain_rx_polarity_flip_physical{17.0}=0x0
phy_chain_rx_polarity_flip_physical{18.0}=0x0
phy_chain_rx_polarity_flip_physical{19.0}=0x1
phy_chain_rx_polarity_flip_physical{20.0}=0x1
phy_chain_tx_lane_map_physical{21.0}=0x3210
phy_chain_tx_polarity_flip_physical{21.0}=0x1
phy_chain_tx_polarity_flip_physical{22.0}=0x1
phy_chain_tx_polarity_flip_physical{23.0}=0x1
phy_chain_tx_polarity_flip_physical{24.0}=0x1
phy_chain_rx_lane_map_physical{21.0}=0x1032
phy_chain_rx_polarity_flip_physical{21.0}=0x0
phy_chain_rx_polarity_flip_physical{22.0}=0x1
phy_chain_rx_polarity_flip_physical{23.0}=0x1
phy_chain_rx_polarity_flip_physical{24.0}=0x0
phy_chain_tx_lane_map_physical{25.0}=0x0213
phy_chain_tx_polarity_flip_physical{25.0}=0x1
phy_chain_tx_polarity_flip_physical{26.0}=0x0
phy_chain_tx_polarity_flip_physical{27.0}=0x0
phy_chain_tx_polarity_flip_physical{28.0}=0x1
phy_chain_rx_lane_map_physical{25.0}=0x1302
phy_chain_rx_polarity_flip_physical{25.0}=0x1
phy_chain_rx_polarity_flip_physical{26.0}=0x1
phy_chain_rx_polarity_flip_physical{27.0}=0x0
phy_chain_rx_polarity_flip_physical{28.0}=0x0
phy_chain_tx_lane_map_physical{37.0}=0x3210
phy_chain_tx_polarity_flip_physical{37.0}=0x1
phy_chain_tx_polarity_flip_physical{38.0}=0x1
phy_chain_tx_polarity_flip_physical{39.0}=0x1
phy_chain_tx_polarity_flip_physical{40.0}=0x1
phy_chain_rx_lane_map_physical{37.0}=0x2103
phy_chain_rx_polarity_flip_physical{37.0}=0x0
phy_chain_rx_polarity_flip_physical{38.0}=0x0
phy_chain_rx_polarity_flip_physical{39.0}=0x1
phy_chain_rx_polarity_flip_physical{40.0}=0x0
phy_chain_tx_lane_map_physical{49.0}=0x0213
phy_chain_tx_polarity_flip_physical{49.0}=0x1
phy_chain_tx_polarity_flip_physical{50.0}=0x0
phy_chain_tx_polarity_flip_physical{51.0}=0x0
phy_chain_tx_polarity_flip_physical{52.0}=0x1
phy_chain_rx_lane_map_physical{49.0}=0x1302
phy_chain_rx_polarity_flip_physical{49.0}=0x1
phy_chain_rx_polarity_flip_physical{50.0}=0x1
phy_chain_rx_polarity_flip_physical{51.0}=0x0
phy_chain_rx_polarity_flip_physical{52.0}=0x0
phy_chain_tx_lane_map_physical{53.0}=0x3210
phy_chain_tx_polarity_flip_physical{53.0}=0x0
phy_chain_tx_polarity_flip_physical{54.0}=0x0
phy_chain_tx_polarity_flip_physical{55.0}=0x0
phy_chain_tx_polarity_flip_physical{56.0}=0x0
phy_chain_rx_lane_map_physical{53.0}=0x2103
phy_chain_rx_polarity_flip_physical{53.0}=0x0
phy_chain_rx_polarity_flip_physical{54.0}=0x0
phy_chain_rx_polarity_flip_physical{55.0}=0x1
phy_chain_rx_polarity_flip_physical{56.0}=0x0
phy_chain_tx_lane_map_physical{57.0}=0x0213
phy_chain_tx_polarity_flip_physical{57.0}=0x0
phy_chain_tx_polarity_flip_physical{58.0}=0x1
phy_chain_tx_polarity_flip_physical{59.0}=0x1
phy_chain_tx_polarity_flip_physical{60.0}=0x0
phy_chain_rx_lane_map_physical{57.0}=0x1302
phy_chain_rx_polarity_flip_physical{57.0}=0x1
phy_chain_rx_polarity_flip_physical{58.0}=0x1
phy_chain_rx_polarity_flip_physical{59.0}=0x0
phy_chain_rx_polarity_flip_physical{60.0}=0x0
phy_chain_tx_lane_map_physical{61.0}=0x3210
phy_chain_tx_polarity_flip_physical{61.0}=0x1
phy_chain_tx_polarity_flip_physical{62.0}=0x1
phy_chain_tx_polarity_flip_physical{63.0}=0x1
phy_chain_tx_polarity_flip_physical{64.0}=0x1
phy_chain_rx_lane_map_physical{61.0}=0x2103
phy_chain_rx_polarity_flip_physical{61.0}=0x0
phy_chain_rx_polarity_flip_physical{62.0}=0x0
phy_chain_rx_polarity_flip_physical{63.0}=0x1
phy_chain_rx_polarity_flip_physical{64.0}=0x0
phy_chain_tx_lane_map_physical{65.0}=0x3210
phy_chain_tx_polarity_flip_physical{65.0}=0x0
phy_chain_tx_polarity_flip_physical{66.0}=0x0
phy_chain_tx_polarity_flip_physical{67.0}=0x1
phy_chain_tx_polarity_flip_physical{68.0}=0x1
phy_chain_rx_lane_map_physical{65.0}=0x3120
phy_chain_rx_polarity_flip_physical{65.0}=0x0
phy_chain_rx_polarity_flip_physical{66.0}=0x0
phy_chain_rx_polarity_flip_physical{67.0}=0x1
phy_chain_rx_polarity_flip_physical{68.0}=0x1
phy_chain_tx_lane_map_physical{69.0}=0x0123
phy_chain_tx_polarity_flip_physical{69.0}=0x0
phy_chain_tx_polarity_flip_physical{70.0}=0x0
phy_chain_tx_polarity_flip_physical{71.0}=0x0
phy_chain_tx_polarity_flip_physical{72.0}=0x0
phy_chain_rx_lane_map_physical{69.0}=0x2301
phy_chain_rx_polarity_flip_physical{69.0}=0x1
phy_chain_rx_polarity_flip_physical{70.0}=0x0
phy_chain_rx_polarity_flip_physical{71.0}=0x0
phy_chain_rx_polarity_flip_physical{72.0}=0x0
phy_chain_tx_lane_map_physical{73.0}=0x3120
phy_chain_tx_polarity_flip_physical{73.0}=0x1
phy_chain_tx_polarity_flip_physical{74.0}=0x0
phy_chain_tx_polarity_flip_physical{75.0}=0x0
phy_chain_tx_polarity_flip_physical{76.0}=0x1
phy_chain_rx_lane_map_physical{73.0}=0x3120
phy_chain_rx_polarity_flip_physical{73.0}=0x0
phy_chain_rx_polarity_flip_physical{74.0}=0x0
phy_chain_rx_polarity_flip_physical{75.0}=0x1
phy_chain_rx_polarity_flip_physical{76.0}=0x1
phy_chain_tx_lane_map_physical{77.0}=0x0213
phy_chain_tx_polarity_flip_physical{77.0}=0x1
phy_chain_tx_polarity_flip_physical{78.0}=0x0
phy_chain_tx_polarity_flip_physical{79.0}=0x0
phy_chain_tx_polarity_flip_physical{80.0}=0x1
phy_chain_rx_lane_map_physical{77.0}=0x0321
phy_chain_rx_polarity_flip_physical{77.0}=0x1
phy_chain_rx_polarity_flip_physical{78.0}=0x1
phy_chain_rx_polarity_flip_physical{79.0}=0x0
phy_chain_rx_polarity_flip_physical{80.0}=0x1
phy_chain_tx_lane_map_physical{93.0}=0x3120
phy_chain_tx_polarity_flip_physical{93.0}=0x1
phy_chain_tx_polarity_flip_physical{94.0}=0x0
phy_chain_tx_polarity_flip_physical{95.0}=0x0
phy_chain_tx_polarity_flip_physical{96.0}=0x1
phy_chain_rx_lane_map_physical{93.0}=0x3120
phy_chain_rx_polarity_flip_physical{93.0}=0x1
phy_chain_rx_polarity_flip_physical{94.0}=0x1
phy_chain_rx_polarity_flip_physical{95.0}=0x0
phy_chain_rx_polarity_flip_physical{96.0}=0x0
phy_chain_tx_lane_map_physical{101.0}=0x0321
phy_chain_tx_polarity_flip_physical{101.0}=0x0
phy_chain_tx_polarity_flip_physical{102.0}=0x1
phy_chain_tx_polarity_flip_physical{103.0}=0x1
phy_chain_tx_polarity_flip_physical{104.0}=0x1
phy_chain_rx_lane_map_physical{101.0}=0x0321
phy_chain_rx_polarity_flip_physical{101.0}=0x1
phy_chain_rx_polarity_flip_physical{102.0}=0x1
phy_chain_rx_polarity_flip_physical{103.0}=0x0
phy_chain_rx_polarity_flip_physical{104.0}=0x1
phy_chain_tx_lane_map_physical{105.0}=0x3120
phy_chain_tx_polarity_flip_physical{105.0}=0x1
phy_chain_tx_polarity_flip_physical{106.0}=0x0
phy_chain_tx_polarity_flip_physical{107.0}=0x0
phy_chain_tx_polarity_flip_physical{108.0}=0x1
phy_chain_rx_lane_map_physical{105.0}=0x3120
phy_chain_rx_polarity_flip_physical{105.0}=0x1
phy_chain_rx_polarity_flip_physical{106.0}=0x1
phy_chain_rx_polarity_flip_physical{107.0}=0x0
phy_chain_rx_polarity_flip_physical{108.0}=0x0
phy_chain_tx_lane_map_physical{109.0}=0x0123
phy_chain_tx_polarity_flip_physical{109.0}=0x1
phy_chain_tx_polarity_flip_physical{110.0}=0x1
phy_chain_tx_polarity_flip_physical{111.0}=0x1
phy_chain_tx_polarity_flip_physical{112.0}=0x1
phy_chain_rx_lane_map_physical{109.0}=0x0321
phy_chain_rx_polarity_flip_physical{109.0}=0x0
phy_chain_rx_polarity_flip_physical{110.0}=0x0
phy_chain_rx_polarity_flip_physical{111.0}=0x1
phy_chain_rx_polarity_flip_physical{112.0}=0x0
phy_chain_tx_lane_map_physical{113.0}=0x0312
phy_chain_tx_polarity_flip_physical{113.0}=0x0
phy_chain_tx_polarity_flip_physical{114.0}=0x0
phy_chain_tx_polarity_flip_physical{115.0}=0x1
phy_chain_tx_polarity_flip_physical{116.0}=0x0
phy_chain_rx_lane_map_physical{113.0}=0x3120
phy_chain_rx_polarity_flip_physical{113.0}=0x1
phy_chain_rx_polarity_flip_physical{114.0}=0x1
phy_chain_rx_polarity_flip_physical{115.0}=0x0
phy_chain_rx_polarity_flip_physical{116.0}=0x1
phy_chain_tx_lane_map_physical{117.0}=0x0123
phy_chain_tx_polarity_flip_physical{117.0}=0x1
phy_chain_tx_polarity_flip_physical{118.0}=0x1
phy_chain_tx_polarity_flip_physical{119.0}=0x1
phy_chain_tx_polarity_flip_physical{120.0}=0x1
phy_chain_rx_lane_map_physical{117.0}=0x1320
phy_chain_rx_polarity_flip_physical{117.0}=0x1
phy_chain_rx_polarity_flip_physical{118.0}=0x1
phy_chain_rx_polarity_flip_physical{119.0}=0x1
phy_chain_rx_polarity_flip_physical{120.0}=0x0
phy_chain_tx_lane_map_physical{121.0}=0x3120
phy_chain_tx_polarity_flip_physical{121.0}=0x1
phy_chain_tx_polarity_flip_physical{122.0}=0x0
phy_chain_tx_polarity_flip_physical{123.0}=0x0
phy_chain_tx_polarity_flip_physical{124.0}=0x1
phy_chain_rx_lane_map_physical{121.0}=0x0123
phy_chain_rx_polarity_flip_physical{121.0}=0x0
phy_chain_rx_polarity_flip_physical{122.0}=0x1
phy_chain_rx_polarity_flip_physical{123.0}=0x0
phy_chain_rx_polarity_flip_physical{124.0}=0x1
phy_chain_tx_lane_map_physical{125.0}=0x0123
phy_chain_tx_polarity_flip_physical{125.0}=0x0
phy_chain_tx_polarity_flip_physical{126.0}=0x0
phy_chain_tx_polarity_flip_physical{127.0}=0x0
phy_chain_tx_polarity_flip_physical{128.0}=0x0
phy_chain_rx_lane_map_physical{125.0}=0x0321
phy_chain_rx_polarity_flip_physical{125.0}=0x0
phy_chain_rx_polarity_flip_physical{126.0}=0x0
phy_chain_rx_polarity_flip_physical{127.0}=0x1
phy_chain_rx_polarity_flip_physical{128.0}=0x0
phy_chain_tx_lane_map_physical{81.0}=0x3201
phy_chain_tx_polarity_flip_physical{81.0}=0x0
phy_chain_tx_polarity_flip_physical{82.0}=0x1
phy_chain_tx_polarity_flip_physical{83.0}=0x1
phy_chain_tx_polarity_flip_physical{84.0}=0x1
phy_chain_rx_lane_map_physical{81.0}=0x3120
phy_chain_rx_polarity_flip_physical{81.0}=0x0
phy_chain_rx_polarity_flip_physical{82.0}=0x0
phy_chain_rx_polarity_flip_physical{83.0}=0x1
phy_chain_rx_polarity_flip_physical{84.0}=0x0
phy_chain_tx_lane_map_physical{85.0}=0x0123
phy_chain_tx_polarity_flip_physical{85.0}=0x1
phy_chain_tx_polarity_flip_physical{86.0}=0x1
phy_chain_tx_polarity_flip_physical{87.0}=0x1
phy_chain_tx_polarity_flip_physical{88.0}=0x1
phy_chain_rx_lane_map_physical{85.0}=0x0321
phy_chain_rx_polarity_flip_physical{85.0}=0x1
phy_chain_rx_polarity_flip_physical{86.0}=0x1
phy_chain_rx_polarity_flip_physical{87.0}=0x0
phy_chain_rx_polarity_flip_physical{88.0}=0x1
phy_chain_tx_lane_map_physical{89.0}=0x3210
phy_chain_tx_polarity_flip_physical{89.0}=0x1
phy_chain_tx_polarity_flip_physical{90.0}=0x1
phy_chain_tx_polarity_flip_physical{91.0}=0x1
phy_chain_tx_polarity_flip_physical{92.0}=0x1
phy_chain_rx_lane_map_physical{89.0}=0x0123
phy_chain_rx_polarity_flip_physical{89.0}=0x1
phy_chain_rx_polarity_flip_physical{90.0}=0x0
phy_chain_rx_polarity_flip_physical{91.0}=0x1
phy_chain_rx_polarity_flip_physical{92.0}=0x0
phy_chain_tx_lane_map_physical{97.0}=0x0312
phy_chain_tx_polarity_flip_physical{97.0}=0x0
phy_chain_tx_polarity_flip_physical{98.0}=0x0
phy_chain_tx_polarity_flip_physical{99.0}=0x1
phy_chain_tx_polarity_flip_physical{100.0}=0x1
phy_chain_rx_lane_map_physical{97.0}=0x0321
phy_chain_rx_polarity_flip_physical{97.0}=0x1
phy_chain_rx_polarity_flip_physical{98.0}=0x0
phy_chain_rx_polarity_flip_physical{99.0}=0x1
phy_chain_rx_polarity_flip_physical{100.0}=0x0

View File

@ -0,0 +1 @@
Quanta-IX7-32X t1

View File

@ -0,0 +1,3 @@
CONSOLE_PORT=0x2f8
CONSOLE_DEV=1
CONSOLE_SPEED=115200

View File

@ -0,0 +1,6 @@
sleep 10
led stop
sleep 3
led start
sleep 3
led auto on

View File

@ -0,0 +1,21 @@
#!/usr/bin/env python
try:
import exceptions
import binascii
import time
import optparse
import warnings
import os
import sys
from sonic_eeprom import eeprom_base
from sonic_eeprom import eeprom_tlvinfo
import subprocess
except ImportError, e:
raise ImportError (str(e) + "- required module not found")
class board(eeprom_tlvinfo.TlvInfoDecoder):
_TLV_INFO_MAX_LEN = 256
def __init__(self, name, path, cpld_root, ro):
self.eeprom_path = "/sys/bus/i2c/devices/18-0054/eeprom"
super(board, self).__init__(self.eeprom_path, 0, '', True)

View File

@ -0,0 +1,49 @@
#
# psuutil.py
# Platform-specific PSU status interface for SONiC
#
import os.path
try:
from sonic_psu.psu_base import PsuBase
except ImportError as e:
raise ImportError (str(e) + "- required module not found")
class PsuUtil(PsuBase):
"""Platform-specific PSUutil class"""
def __init__(self):
PsuBase.__init__(self)
def get_num_psus(self):
"""
Retrieves the number of PSUs available on the device
:return: An integer, the number of PSUs available on the device
"""
MAX_PSUS = 2
return MAX_PSUS
def get_psu_status(self, index):
"""
Retrieves the oprational status of power supply unit (PSU) defined
by index <index>
:param index: An integer, index of the PSU of which to query status
:return: Boolean, True if PSU is operating properly, False if PSU is\
faulty
"""
status = 1
return status
def get_psu_presence(self, index):
"""
Retrieves the presence status of power supply unit (PSU) defined
by index <index>
:param index: An integer, index of the PSU of which to query status
:return: Boolean, True if PSU is plugged, False if not
"""
status = 1
return status

View File

@ -0,0 +1,171 @@
#!/usr/bin/env python
try:
import time
from sonic_sfp.sfputilbase import SfpUtilBase
except ImportError, e:
raise ImportError (str(e) + "- required module not found")
class SfpUtil(SfpUtilBase):
"""Platform specific SfpUtill class"""
PORT_START = 0
PORT_END = 31
PORTS_IN_BLOCK = 32
_port_to_eeprom_mapping = {}
_port_to_i2c_mapping = {
0 : 32,
1 : 33,
2 : 34,
3 : 35,
4 : 36,
5 : 37,
6 : 38,
7 : 39,
8 : 40,
9 : 41,
10 : 42,
11 : 43,
12 : 44,
13 : 45,
14 : 46,
15 : 47,
16 : 48,
17 : 49,
18 : 50,
19 : 51,
20 : 52,
21 : 53,
22 : 54,
23 : 55,
24 : 56,
25 : 57,
26 : 58,
27 : 59,
28 : 60,
29 : 61,
30 : 62,
31 : 63,
}
@property
def port_start(self):
return self.PORT_START
@property
def port_end(self):
return self.PORT_END
@property
def qsfp_ports(self):
return range(self.PORT_START, self.PORTS_IN_BLOCK + 1)
@property
def port_to_eeprom_mapping(self):
return self._port_to_eeprom_mapping
def __init__(self):
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
for x in range(0, self.port_end+1):
self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x])
SfpUtilBase.__init__(self)
def get_presence(self, port_num):
# Check for invalid port_num
if port_num < self.PORT_START or port_num > self.PORT_END:
return False
try:
reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/module_present")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = reg_file.readline().rstrip()
if reg_value == '1':
return True
return False
def get_low_power_mode(self, port_num):
# Check for invalid port_num
if port_num < self.port_start or port_num > self.port_end:
return False
try:
reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/lpmode")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = int(reg_file.readline().rstrip())
if reg_value == 0:
return False
return True
def set_low_power_mode(self, port_num, lpmode):
# Check for invalid port_num
if port_num < self.port_start or port_num > self.port_end:
return False
try:
reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/lpmode", "r+")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = int(reg_file.readline().rstrip())
# LPMode is active high; set or clear the bit accordingly
if lpmode is True:
reg_value = 1
else:
reg_value = 0
reg_file.write(hex(reg_value))
reg_file.close()
return True
def reset(self, port_num):
# Check for invalid port_num
if port_num < self.port_start or port_num > self.port_end:
return False
try:
reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/reset", "r+")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = 0
reg_file.write(hex(reg_value))
reg_file.close()
# Sleep 2 second to allow it to settle
time.sleep(2)
# Flip the value back write back to the register to take port out of reset
try:
reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/reset", "r+")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = 1
reg_file.write(hex(reg_value))
reg_file.close()
return True
def get_transceiver_change_event(self):
"""
TODO: This function need to be implemented
when decide to support monitoring SFP(Xcvrd)
on this platform.
"""
raise NotImplementedError

View File

@ -0,0 +1,57 @@
# name lanes alias index speed
Ethernet0 60 twentyfiveGigE1 0 25000
Ethernet1 59 twentyfiveGigE2 1 25000
Ethernet2 58 twentyfiveGigE3 2 25000
Ethernet3 57 twentyfiveGigE4 3 25000
Ethernet4 64 twentyfiveGigE5 4 25000
Ethernet5 63 twentyfiveGigE6 5 25000
Ethernet6 62 twentyfiveGigE7 6 25000
Ethernet7 61 twentyfiveGigE8 7 25000
Ethernet8 49 twentyfiveGigE9 8 25000
Ethernet9 50 twentyfiveGigE10 9 25000
Ethernet10 51 twentyfiveGigE11 10 25000
Ethernet11 52 twentyfiveGigE12 11 25000
Ethernet12 4 twentyfiveGigE13 12 25000
Ethernet13 3 twentyfiveGigE14 13 25000
Ethernet14 2 twentyfiveGigE15 14 25000
Ethernet15 1 twentyfiveGigE16 15 25000
Ethernet16 8 twentyfiveGigE17 16 25000
Ethernet17 7 twentyfiveGigE18 17 25000
Ethernet18 6 twentyfiveGigE19 18 25000
Ethernet19 5 twentyfiveGigE20 19 25000
Ethernet20 16 twentyfiveGigE21 20 25000
Ethernet21 15 twentyfiveGigE22 21 25000
Ethernet22 14 twentyfiveGigE23 22 25000
Ethernet23 13 twentyfiveGigE24 23 25000
Ethernet24 24 twentyfiveGigE25 24 25000
Ethernet25 23 twentyfiveGigE26 25 25000
Ethernet26 22 twentyfiveGigE27 26 25000
Ethernet27 21 twentyfiveGigE28 27 25000
Ethernet28 32 twentyfiveGigE29 28 25000
Ethernet29 31 twentyfiveGigE30 29 25000
Ethernet30 30 twentyfiveGigE31 30 25000
Ethernet31 29 twentyfiveGigE32 31 25000
Ethernet32 36 twentyfiveGigE33 32 25000
Ethernet33 35 twentyfiveGigE34 33 25000
Ethernet34 34 twentyfiveGigE35 34 25000
Ethernet35 33 twentyfiveGigE36 35 25000
Ethernet36 44 twentyfiveGigE37 36 25000
Ethernet37 43 twentyfiveGigE38 37 25000
Ethernet38 42 twentyfiveGigE39 38 25000
Ethernet39 41 twentyfiveGigE40 39 25000
Ethernet40 86 twentyfiveGigE41 40 25000
Ethernet41 85 twentyfiveGigE42 41 25000
Ethernet42 88 twentyfiveGigE43 42 25000
Ethernet43 87 twentyfiveGigE44 43 25000
Ethernet44 94 twentyfiveGigE45 44 25000
Ethernet45 93 twentyfiveGigE46 45 25000
Ethernet46 96 twentyfiveGigE47 46 25000
Ethernet47 95 twentyfiveGigE48 47 25000
Ethernet48 97,98,99,100 hundredGigE49 48 100000
Ethernet52 105,106,107,108 hundredGigE50 49 100000
Ethernet56 113,114,115,116 hundredGigE51 50 100000
Ethernet60 121,122,123,124 hundredGigE52 51 100000
Ethernet64 77,78,79,80 hundredGigE53 52 100000
Ethernet68 65,66,67,68 hundredGigE54 53 100000
Ethernet72 69,70,71,72 hundredGigE55 54 100000
Ethernet76 125,126,127,128 hundredGigE56 55 100000

View File

@ -0,0 +1 @@
SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-ix8-48x25G+8x100G.config.bcm

View File

@ -0,0 +1,480 @@
bcm_tunnel_term_compatible_mode=1
core_clock_frequency=1525
dpp_clock_ratio=2:3
parity_enable=0
mem_cache_enable=0
l2_mem_entries=40960
l3_mem_entries=40960
fpem_mem_entries=16384
l2xmsg_mode=1
bcm_num_cos=8
bcm_stat_interval=2000000
cdma_timeout_usec=3000000
ifp_inports_support_enable=1
ipv6_lpm_128b_enable=0x1
l3_max_ecmp_mode=1
l3_alpm_enable=2
lpm_scaling_enable=0
miim_intr_enable=0
module_64ports=1
schan_intr_enable=0
skip_L2_USER_ENTRY=0
stable_size=0x5500000
tdma_timeout_usec=3000000
# portmap settings
oversubscribe_mode=1
pbmp_xport_xe=0x48808080f8780808dfe1e1e1fe1e1e1fe
port_flex_enable=1
portmap_1=1:25
portmap_2=2:25
portmap_3=3:25
portmap_4=4:25
portmap_5=5:25
portmap_6=6:25
portmap_7=7:25
portmap_8=8:25
portmap_13=13:25
portmap_14=14:25
portmap_15=15:25
portmap_16=16:25
portmap_21=21:25
portmap_22=22:25
portmap_23=23:25
portmap_24=24:25
portmap_29=29:25
portmap_30=30:25
portmap_31=31:25
portmap_32=32:25
portmap_33=33:25
portmap_34=34:25
portmap_35=35:25
portmap_36=36:25
portmap_41=41:25
portmap_42=42:25
portmap_43=43:25
portmap_44=44:25
portmap_49=49:25
portmap_50=50:25
portmap_51=51:25
portmap_52=52:25
portmap_57=57:25
portmap_58=58:25
portmap_59=59:25
portmap_60=60:25
portmap_61=61:25
portmap_62=62:25
portmap_63=63:25
portmap_64=64:25
portmap_67=65:100
portmap_71=69:100
portmap_79=77:100
portmap_87=85:25
portmap_88=86:25
portmap_89=87:25
portmap_90=88:25
portmap_95=93:25
portmap_96=94:25
portmap_97=95:25
portmap_98=96:25
portmap_99=97:100
portmap_107=105:100
portmap_115=113:100
portmap_123=121:100
portmap_127=125:100
# datapath port -- MerlinCore
portmap_66=129:10:m
portmap_130=128:10:m
# loopback port
portmap_65=130:10
portmap_131=131:10
### interface setting
# TSCF / TSCE interface definition
# NULL 1
# GMII 3
# SGMII 4
# XGMII 6
# SFI 9
# XFI 10
# KR 11
# KR4 12
# CR 13
# CR4 14
# XLAUI 15
# SR 16
# ILKN 21
# CAUI 25
# LR 26
# LR4 27
# SR4 28
# SR2 38
# KR2 39
# CR2 40
# XLAUI2 42
# LR2 55
# CAUI4 62
###
serdes_if_type_1=13
serdes_if_type_2=13
serdes_if_type_3=13
serdes_if_type_4=13
serdes_if_type_5=13
serdes_if_type_6=13
serdes_if_type_7=13
serdes_if_type_8=13
serdes_if_type_13=13
serdes_if_type_14=13
serdes_if_type_15=13
serdes_if_type_16=13
serdes_if_type_21=13
serdes_if_type_22=13
serdes_if_type_23=13
serdes_if_type_24=13
serdes_if_type_29=13
serdes_if_type_30=13
serdes_if_type_31=13
serdes_if_type_32=13
serdes_if_type_33=13
serdes_if_type_34=13
serdes_if_type_35=13
serdes_if_type_36=13
serdes_if_type_41=13
serdes_if_type_42=13
serdes_if_type_43=13
serdes_if_type_44=13
serdes_if_type_49=13
serdes_if_type_50=13
serdes_if_type_51=13
serdes_if_type_52=13
serdes_if_type_57=13
serdes_if_type_58=13
serdes_if_type_59=13
serdes_if_type_60=13
serdes_if_type_61=13
serdes_if_type_62=13
serdes_if_type_63=13
serdes_if_type_64=13
serdes_if_type_67=14
serdes_if_type_71=14
serdes_if_type_79=14
serdes_if_type_87=13
serdes_if_type_88=13
serdes_if_type_89=13
serdes_if_type_90=13
serdes_if_type_95=13
serdes_if_type_96=13
serdes_if_type_97=13
serdes_if_type_98=13
serdes_if_type_99=14
serdes_if_type_107=14
serdes_if_type_115=14
serdes_if_type_123=14
serdes_if_type_127=14
serdes_if_type_66=11
serdes_if_type_130=11
dport_map_port_60=1
dport_map_port_59=2
dport_map_port_58=3
dport_map_port_57=4
dport_map_port_64=5
dport_map_port_63=6
dport_map_port_62=7
dport_map_port_61=8
dport_map_port_49=9
dport_map_port_50=10
dport_map_port_51=11
dport_map_port_52=12
dport_map_port_4=13
dport_map_port_3=14
dport_map_port_2=15
dport_map_port_1=16
dport_map_port_8=17
dport_map_port_7=18
dport_map_port_6=19
dport_map_port_5=20
dport_map_port_16=21
dport_map_port_15=22
dport_map_port_14=23
dport_map_port_13=24
dport_map_port_24=25
dport_map_port_23=26
dport_map_port_22=27
dport_map_port_21=28
dport_map_port_32=29
dport_map_port_31=30
dport_map_port_30=31
dport_map_port_29=32
dport_map_port_36=33
dport_map_port_35=34
dport_map_port_34=35
dport_map_port_33=36
dport_map_port_44=37
dport_map_port_43=38
dport_map_port_42=39
dport_map_port_41=40
dport_map_port_88=41
dport_map_port_87=42
dport_map_port_90=43
dport_map_port_89=44
dport_map_port_96=45
dport_map_port_95=46
dport_map_port_98=47
dport_map_port_97=48
dport_map_port_99=49
dport_map_port_107=50
dport_map_port_115=51
dport_map_port_123=52
dport_map_port_79=53
dport_map_port_67=54
dport_map_port_71=55
dport_map_port_127=56
dport_map_port_66=57
dport_map_port_130=58
phy_chain_tx_lane_map_physical{1.0}=0x3210
phy_chain_tx_polarity_flip_physical{1.0}=0x1
phy_chain_tx_polarity_flip_physical{2.0}=0x1
phy_chain_tx_polarity_flip_physical{3.0}=0x1
phy_chain_tx_polarity_flip_physical{4.0}=0x1
phy_chain_rx_lane_map_physical{1.0}=0x3210
phy_chain_rx_polarity_flip_physical{1.0}=0x1
phy_chain_rx_polarity_flip_physical{2.0}=0x0
phy_chain_rx_polarity_flip_physical{3.0}=0x1
phy_chain_rx_polarity_flip_physical{4.0}=0x0
phy_chain_tx_lane_map_physical{5.0}=0x3210
phy_chain_tx_polarity_flip_physical{5.0}=0x0
phy_chain_tx_polarity_flip_physical{6.0}=0x0
phy_chain_tx_polarity_flip_physical{7.0}=0x0
phy_chain_tx_polarity_flip_physical{8.0}=0x1
phy_chain_rx_lane_map_physical{5.0}=0x3210
phy_chain_rx_polarity_flip_physical{5.0}=0x0
phy_chain_rx_polarity_flip_physical{6.0}=0x1
phy_chain_rx_polarity_flip_physical{7.0}=0x0
phy_chain_rx_polarity_flip_physical{8.0}=0x1
phy_chain_tx_lane_map_physical{13.0}=0x3210
phy_chain_tx_polarity_flip_physical{13.0}=0x0
phy_chain_tx_polarity_flip_physical{14.0}=0x0
phy_chain_tx_polarity_flip_physical{15.0}=0x0
phy_chain_tx_polarity_flip_physical{16.0}=0x0
phy_chain_rx_lane_map_physical{13.0}=0x3210
phy_chain_rx_polarity_flip_physical{13.0}=0x0
phy_chain_rx_polarity_flip_physical{14.0}=0x1
phy_chain_rx_polarity_flip_physical{15.0}=0x0
phy_chain_rx_polarity_flip_physical{16.0}=0x1
phy_chain_tx_lane_map_physical{21.0}=0x3210
phy_chain_tx_polarity_flip_physical{21.0}=0x0
phy_chain_tx_polarity_flip_physical{22.0}=0x0
phy_chain_tx_polarity_flip_physical{23.0}=0x0
phy_chain_tx_polarity_flip_physical{24.0}=0x0
phy_chain_rx_lane_map_physical{21.0}=0x3210
phy_chain_rx_polarity_flip_physical{21.0}=0x0
phy_chain_rx_polarity_flip_physical{22.0}=0x1
phy_chain_rx_polarity_flip_physical{23.0}=0x0
phy_chain_rx_polarity_flip_physical{24.0}=0x1
phy_chain_tx_lane_map_physical{29.0}=0x3210
phy_chain_tx_polarity_flip_physical{29.0}=0x0
phy_chain_tx_polarity_flip_physical{30.0}=0x0
phy_chain_tx_polarity_flip_physical{31.0}=0x0
phy_chain_tx_polarity_flip_physical{32.0}=0x0
phy_chain_rx_lane_map_physical{29.0}=0x3210
phy_chain_rx_polarity_flip_physical{29.0}=0x1
phy_chain_rx_polarity_flip_physical{30.0}=0x0
phy_chain_rx_polarity_flip_physical{31.0}=0x1
phy_chain_rx_polarity_flip_physical{32.0}=0x0
phy_chain_tx_lane_map_physical{33.0}=0x3210
phy_chain_tx_polarity_flip_physical{33.0}=0x0
phy_chain_tx_polarity_flip_physical{34.0}=0x0
phy_chain_tx_polarity_flip_physical{35.0}=0x0
phy_chain_tx_polarity_flip_physical{36.0}=0x0
phy_chain_rx_lane_map_physical{33.0}=0x3210
phy_chain_rx_polarity_flip_physical{33.0}=0x0
phy_chain_rx_polarity_flip_physical{34.0}=0x1
phy_chain_rx_polarity_flip_physical{35.0}=0x0
phy_chain_rx_polarity_flip_physical{36.0}=0x1
phy_chain_tx_lane_map_physical{41.0}=0x3210
phy_chain_tx_polarity_flip_physical{41.0}=0x0
phy_chain_tx_polarity_flip_physical{42.0}=0x0
phy_chain_tx_polarity_flip_physical{43.0}=0x0
phy_chain_tx_polarity_flip_physical{44.0}=0x0
phy_chain_rx_lane_map_physical{41.0}=0x3210
phy_chain_rx_polarity_flip_physical{41.0}=0x0
phy_chain_rx_polarity_flip_physical{42.0}=0x1
phy_chain_rx_polarity_flip_physical{43.0}=0x0
phy_chain_rx_polarity_flip_physical{44.0}=0x1
phy_chain_tx_lane_map_physical{49.0}=0x3210
phy_chain_tx_polarity_flip_physical{49.0}=0x1
phy_chain_tx_polarity_flip_physical{50.0}=0x1
phy_chain_tx_polarity_flip_physical{51.0}=0x1
phy_chain_tx_polarity_flip_physical{52.0}=0x1
phy_chain_rx_lane_map_physical{49.0}=0x3210
phy_chain_rx_polarity_flip_physical{49.0}=0x0
phy_chain_rx_polarity_flip_physical{50.0}=0x0
phy_chain_rx_polarity_flip_physical{51.0}=0x1
phy_chain_rx_polarity_flip_physical{52.0}=0x0
phy_chain_tx_lane_map_physical{57.0}=0x3210
phy_chain_tx_polarity_flip_physical{57.0}=0x1
phy_chain_tx_polarity_flip_physical{58.0}=0x1
phy_chain_tx_polarity_flip_physical{59.0}=0x1
phy_chain_tx_polarity_flip_physical{60.0}=0x1
phy_chain_rx_lane_map_physical{57.0}=0x3210
phy_chain_rx_polarity_flip_physical{57.0}=0x0
phy_chain_rx_polarity_flip_physical{58.0}=0x1
phy_chain_rx_polarity_flip_physical{59.0}=0x1
phy_chain_rx_polarity_flip_physical{60.0}=0x1
phy_chain_tx_lane_map_physical{61.0}=0x3210
phy_chain_tx_polarity_flip_physical{61.0}=0x1
phy_chain_tx_polarity_flip_physical{62.0}=0x1
phy_chain_tx_polarity_flip_physical{63.0}=0x1
phy_chain_tx_polarity_flip_physical{64.0}=0x1
phy_chain_rx_lane_map_physical{61.0}=0x3210
phy_chain_rx_polarity_flip_physical{61.0}=0x1
phy_chain_rx_polarity_flip_physical{62.0}=0x0
phy_chain_rx_polarity_flip_physical{63.0}=0x1
phy_chain_rx_polarity_flip_physical{64.0}=0x0
phy_chain_tx_lane_map_physical{65.0}=0x0123
phy_chain_tx_polarity_flip_physical{65.0}=0x1
phy_chain_tx_polarity_flip_physical{66.0}=0x1
phy_chain_tx_polarity_flip_physical{67.0}=0x1
phy_chain_tx_polarity_flip_physical{68.0}=0x1
phy_chain_rx_lane_map_physical{65.0}=0x0321
phy_chain_rx_polarity_flip_physical{65.0}=0x0
phy_chain_rx_polarity_flip_physical{66.0}=0x0
phy_chain_rx_polarity_flip_physical{67.0}=0x1
phy_chain_rx_polarity_flip_physical{68.0}=0x0
phy_chain_tx_lane_map_physical{69.0}=0x3120
phy_chain_tx_polarity_flip_physical{69.0}=0x0
phy_chain_tx_polarity_flip_physical{70.0}=0x1
phy_chain_tx_polarity_flip_physical{71.0}=0x1
phy_chain_tx_polarity_flip_physical{72.0}=0x1
phy_chain_rx_lane_map_physical{69.0}=0x0123
phy_chain_rx_polarity_flip_physical{69.0}=0x0
phy_chain_rx_polarity_flip_physical{70.0}=0x1
phy_chain_rx_polarity_flip_physical{71.0}=0x0
phy_chain_rx_polarity_flip_physical{72.0}=0x0
phy_chain_tx_lane_map_physical{77.0}=0x2130
phy_chain_tx_polarity_flip_physical{77.0}=0x1
phy_chain_tx_polarity_flip_physical{78.0}=0x1
phy_chain_tx_polarity_flip_physical{79.0}=0x0
phy_chain_tx_polarity_flip_physical{80.0}=0x0
phy_chain_rx_lane_map_physical{77.0}=0x3102
phy_chain_rx_polarity_flip_physical{77.0}=0x1
phy_chain_rx_polarity_flip_physical{78.0}=0x1
phy_chain_rx_polarity_flip_physical{79.0}=0x0
phy_chain_rx_polarity_flip_physical{80.0}=0x0
phy_chain_tx_lane_map_physical{85.0}=0x3210
phy_chain_tx_polarity_flip_physical{85.0}=0x1
phy_chain_tx_polarity_flip_physical{86.0}=0x1
phy_chain_tx_polarity_flip_physical{87.0}=0x0
phy_chain_tx_polarity_flip_physical{88.0}=0x1
phy_chain_rx_lane_map_physical{85.0}=0x3210
phy_chain_rx_polarity_flip_physical{85.0}=0x0
phy_chain_rx_polarity_flip_physical{86.0}=0x0
phy_chain_rx_polarity_flip_physical{87.0}=0x1
phy_chain_rx_polarity_flip_physical{88.0}=0x1
phy_chain_tx_lane_map_physical{93.0}=0x3210
phy_chain_tx_polarity_flip_physical{93.0}=0x0
phy_chain_tx_polarity_flip_physical{94.0}=0x1
phy_chain_tx_polarity_flip_physical{95.0}=0x0
phy_chain_tx_polarity_flip_physical{96.0}=0x1
phy_chain_rx_lane_map_physical{93.0}=0x3210
phy_chain_rx_polarity_flip_physical{93.0}=0x1
phy_chain_rx_polarity_flip_physical{94.0}=0x1
phy_chain_rx_polarity_flip_physical{95.0}=0x1
phy_chain_rx_polarity_flip_physical{96.0}=0x1
phy_chain_tx_lane_map_physical{97.0}=0x0312
phy_chain_tx_polarity_flip_physical{97.0}=0x0
phy_chain_tx_polarity_flip_physical{98.0}=0x0
phy_chain_tx_polarity_flip_physical{99.0}=0x1
phy_chain_tx_polarity_flip_physical{100.0}=0x1
phy_chain_rx_lane_map_physical{97.0}=0x1023
phy_chain_rx_polarity_flip_physical{97.0}=0x0
phy_chain_rx_polarity_flip_physical{98.0}=0x0
phy_chain_rx_polarity_flip_physical{99.0}=0x0
phy_chain_rx_polarity_flip_physical{100.0}=0x0
phy_chain_tx_lane_map_physical{105.0}=0x0123
phy_chain_tx_polarity_flip_physical{105.0}=0x0
phy_chain_tx_polarity_flip_physical{106.0}=0x0
phy_chain_tx_polarity_flip_physical{107.0}=0x0
phy_chain_tx_polarity_flip_physical{108.0}=0x0
phy_chain_rx_lane_map_physical{105.0}=0x0321
phy_chain_rx_polarity_flip_physical{105.0}=0x0
phy_chain_rx_polarity_flip_physical{106.0}=0x1
phy_chain_rx_polarity_flip_physical{107.0}=0x0
phy_chain_rx_polarity_flip_physical{108.0}=0x1
phy_chain_tx_lane_map_physical{113.0}=0x3120
phy_chain_tx_polarity_flip_physical{113.0}=0x1
phy_chain_tx_polarity_flip_physical{114.0}=0x0
phy_chain_tx_polarity_flip_physical{115.0}=0x0
phy_chain_tx_polarity_flip_physical{116.0}=0x0
phy_chain_rx_lane_map_physical{113.0}=0x1023
phy_chain_rx_polarity_flip_physical{113.0}=0x1
phy_chain_rx_polarity_flip_physical{114.0}=0x1
phy_chain_rx_polarity_flip_physical{115.0}=0x1
phy_chain_rx_polarity_flip_physical{116.0}=0x0
phy_chain_tx_lane_map_physical{121.0}=0x0132
phy_chain_tx_polarity_flip_physical{121.0}=0x1
phy_chain_tx_polarity_flip_physical{122.0}=0x1
phy_chain_tx_polarity_flip_physical{123.0}=0x0
phy_chain_tx_polarity_flip_physical{124.0}=0x0
phy_chain_rx_lane_map_physical{121.0}=0x0321
phy_chain_rx_polarity_flip_physical{121.0}=0x0
phy_chain_rx_polarity_flip_physical{122.0}=0x1
phy_chain_rx_polarity_flip_physical{123.0}=0x0
phy_chain_rx_polarity_flip_physical{124.0}=0x1
phy_chain_tx_lane_map_physical{125.0}=0x0213
phy_chain_tx_polarity_flip_physical{125.0}=0x0
phy_chain_tx_polarity_flip_physical{126.0}=0x0
phy_chain_tx_polarity_flip_physical{127.0}=0x0
phy_chain_tx_polarity_flip_physical{128.0}=0x1
phy_chain_rx_lane_map_physical{125.0}=0x0321
phy_chain_rx_polarity_flip_physical{125.0}=0x1
phy_chain_rx_polarity_flip_physical{126.0}=0x1
phy_chain_rx_polarity_flip_physical{127.0}=0x0
phy_chain_rx_polarity_flip_physical{128.0}=0x0
### MerlinCore
phy_chain_tx_lane_map_physical{129.0}=0x3210
phy_chain_tx_polarity_flip_physical{129.0}=0x0
phy_chain_tx_polarity_flip_physical{130.0}=0x1
phy_chain_tx_polarity_flip_physical{131.0}=0x1
phy_chain_tx_polarity_flip_physical{132.0}=0x1
phy_chain_rx_lane_map_physical{129.0}=0x3210
phy_chain_rx_polarity_flip_physical{129.0}=0x0
phy_chain_rx_polarity_flip_physical{130.0}=0x0
phy_chain_rx_polarity_flip_physical{131.0}=0x0
phy_chain_rx_polarity_flip_physical{132.0}=0x0

View File

@ -0,0 +1 @@
Quanta-IX8-56X t1

View File

@ -0,0 +1,3 @@
CONSOLE_PORT=0x2f8
CONSOLE_DEV=1
CONSOLE_SPEED=115200

View File

@ -0,0 +1,6 @@
sleep 10
led stop
sleep 3
led start
sleep 3
led auto on

View File

@ -0,0 +1,21 @@
#!/usr/bin/env python
try:
import exceptions
import binascii
import time
import optparse
import warnings
import os
import sys
from sonic_eeprom import eeprom_base
from sonic_eeprom import eeprom_tlvinfo
import subprocess
except ImportError, e:
raise ImportError (str(e) + "- required module not found")
class board(eeprom_tlvinfo.TlvInfoDecoder):
_TLV_INFO_MAX_LEN = 256
def __init__(self, name, path, cpld_root, ro):
self.eeprom_path = "/sys/bus/i2c/devices/18-0054/eeprom"
super(board, self).__init__(self.eeprom_path, 0, '', True)

View File

@ -0,0 +1,49 @@
#
# psuutil.py
# Platform-specific PSU status interface for SONiC
#
import os.path
try:
from sonic_psu.psu_base import PsuBase
except ImportError as e:
raise ImportError (str(e) + "- required module not found")
class PsuUtil(PsuBase):
"""Platform-specific PSUutil class"""
def __init__(self):
PsuBase.__init__(self)
def get_num_psus(self):
"""
Retrieves the number of PSUs available on the device
:return: An integer, the number of PSUs available on the device
"""
MAX_PSUS = 2
return MAX_PSUS
def get_psu_status(self, index):
"""
Retrieves the oprational status of power supply unit (PSU) defined
by index <index>
:param index: An integer, index of the PSU of which to query status
:return: Boolean, True if PSU is operating properly, False if PSU is\
faulty
"""
status = 1
return status
def get_psu_presence(self, index):
"""
Retrieves the presence status of power supply unit (PSU) defined
by index <index>
:param index: An integer, index of the PSU of which to query status
:return: Boolean, True if PSU is plugged, False if not
"""
status = 1
return status

View File

@ -0,0 +1,207 @@
#!/usr/bin/env python
try:
import time
from sonic_sfp.sfputilbase import SfpUtilBase
except ImportError, e:
raise ImportError (str(e) + "- required module not found")
class SfpUtil(SfpUtilBase):
"""Platform specific SfpUtill class"""
PORT_START = 0
PORT_END = 55
QSFP_PORT_START = 48
PORTS_IN_BLOCK = 56
_port_to_eeprom_mapping = {}
_port_to_i2c_mapping = {
0 : 32,
1 : 33,
2 : 34,
3 : 35,
4 : 36,
5 : 37,
6 : 38,
7 : 39,
8 : 40,
9 : 41,
10 : 42,
11 : 43,
12 : 44,
13 : 45,
14 : 46,
15 : 47,
16 : 48,
17 : 49,
18 : 50,
19 : 51,
20 : 52,
21 : 53,
22 : 54,
23 : 55,
24 : 56,
25 : 57,
26 : 58,
27 : 59,
28 : 60,
29 : 61,
30 : 62,
31 : 63,
32 : 64,
33 : 65,
34 : 66,
35 : 67,
36 : 68,
37 : 69,
38 : 70,
39 : 71,
40 : 72,
41 : 73,
42 : 74,
43 : 75,
44 : 76,
45 : 77,
46 : 78,
47 : 79,
48 : 80,#QSFP49
49 : 81,#QSFP50
50 : 82,#QSFP51
51 : 83,#QSFP52
52 : 84,#QSFP53
53 : 85,#QSFP54
54 : 86,#QSFP55
55 : 87,#QSFP56
}
@property
def port_start(self):
return self.PORT_START
@property
def qsfp_port_start(self):
return self.QSFP_PORT_START
@property
def port_end(self):
return self.PORT_END
@property
def qsfp_ports(self):
return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1)
@property
def port_to_eeprom_mapping(self):
return self._port_to_eeprom_mapping
def __init__(self):
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
for x in range(0, self.port_end+1):
self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x])
SfpUtilBase.__init__(self)
def get_presence(self, port_num):
# Check for invalid port_num
if port_num < self.PORT_START or port_num > self.PORT_END:
return False
try:
if port_num < 48:
reg_file = open("/sys/class/cpld-sfp28/port-"+str(port_num+1)+"/pre_n")
else:
reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+34)+"/value")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = reg_file.readline().rstrip()
if port_num < 48:
if reg_value == '1':
return True
else:
if reg_value == '0':
return True
return False
def get_low_power_mode(self, port_num):
# Check for invalid port_num
if port_num < self.qsfp_port_start or port_num > self.port_end:
return False
try:
reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+35)+"/value")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = int(reg_file.readline().rstrip())
if reg_value == 0:
return False
return True
def set_low_power_mode(self, port_num, lpmode):
# Check for invalid port_num
if port_num < self.qsfp_port_start or port_num > self.port_end:
return False
try:
reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+35)+"/value", "r+")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = int(reg_file.readline().rstrip())
# LPMode is active high; set or clear the bit accordingly
if lpmode is True:
reg_value = 1
else:
reg_value = 0
reg_file.write(hex(reg_value))
reg_file.close()
return True
def reset(self, port_num):
# Check for invalid port_num
if port_num < self.qsfp_port_start or port_num > self.port_end:
return False
try:
reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+32)+"/value", "r+")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = 0
reg_file.write(hex(reg_value))
reg_file.close()
# Sleep 2 second to allow it to settle
time.sleep(2)
# Flip the value back write back to the register to take port out of reset
try:
reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+32)+"/value", "r+")
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
reg_value = 1
reg_file.write(hex(reg_value))
reg_file.close()
return True
def get_transceiver_change_event(self):
"""
TODO: This function need to be implemented
when decide to support monitoring SFP(Xcvrd)
on this platform.
"""
raise NotImplementedError

View File

@ -41,6 +41,8 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \
$(DELTA_AG5648_PLATFORM_MODULE) \ $(DELTA_AG5648_PLATFORM_MODULE) \
$(DELTA_ET6248BRB_PLATFORM_MODULE) \ $(DELTA_ET6248BRB_PLATFORM_MODULE) \
$(QUANTA_IX1B_32X_PLATFORM_MODULE) \ $(QUANTA_IX1B_32X_PLATFORM_MODULE) \
$(QUANTA_IX7_32X_PLATFORM_MODULE) \
$(QUANTA_IX8_56X_PLATFORM_MODULE) \
$(QUANTA_IX8C_56X_PLATFORM_MODULE) \ $(QUANTA_IX8C_56X_PLATFORM_MODULE) \
$(MITAC_LY1200_32X_PLATFORM_MODULE) \ $(MITAC_LY1200_32X_PLATFORM_MODULE) \
$(ALPHANETWORKS_SNH60A0_320FV2_PLATFORM_MODULE) \ $(ALPHANETWORKS_SNH60A0_320FV2_PLATFORM_MODULE) \

View File

@ -1,9 +1,13 @@
# Quanta Platform modules # Quanta Platform modules
QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION = 1.0 QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION = 1.0
QUANTA_IX7_32X_PLATFORM_MODULE_VERSION = 1.0
QUANTA_IX8_56X_PLATFORM_MODULE_VERSION = 1.0
QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION = 1.0 QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION = 1.0
export QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION export QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION
export QUANTA_IX7_32X_PLATFORM_MODULE_VERSION
export QUANTA_IX8_56X_PLATFORM_MODULE_VERSION
export QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION export QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION
QUANTA_IX1B_32X_PLATFORM_MODULE = sonic-platform-quanta-ix1b-32x_$(QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION)_amd64.deb QUANTA_IX1B_32X_PLATFORM_MODULE = sonic-platform-quanta-ix1b-32x_$(QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION)_amd64.deb
@ -12,6 +16,14 @@ $(QUANTA_IX1B_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_C
$(QUANTA_IX1B_32X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix1b_rglbmc-r0 $(QUANTA_IX1B_32X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix1b_rglbmc-r0
SONIC_DPKG_DEBS += $(QUANTA_IX1B_32X_PLATFORM_MODULE) SONIC_DPKG_DEBS += $(QUANTA_IX1B_32X_PLATFORM_MODULE)
QUANTA_IX7_32X_PLATFORM_MODULE = sonic-platform-quanta-ix7-32x_$(QUANTA_IX7_32X_PLATFORM_MODULE_VERSION)_amd64.deb
$(QUANTA_IX7_32X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix7_rglbmc-r0
$(eval $(call add_extra_package,$(QUANTA_IX1B_32X_PLATFORM_MODULE),$(QUANTA_IX7_32X_PLATFORM_MODULE)))
QUANTA_IX8_56X_PLATFORM_MODULE = sonic-platform-quanta-ix8-56x_$(QUANTA_IX8_56X_PLATFORM_MODULE_VERSION)_amd64.deb
$(QUANTA_IX8_56X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix8_rglbmc-r0
$(eval $(call add_extra_package,$(QUANTA_IX1B_32X_PLATFORM_MODULE),$(QUANTA_IX8_56X_PLATFORM_MODULE)))
QUANTA_IX8C_56X_PLATFORM_MODULE = sonic-platform-quanta-ix8c-56x_$(QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION)_amd64.deb QUANTA_IX8C_56X_PLATFORM_MODULE = sonic-platform-quanta-ix8c-56x_$(QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION)_amd64.deb
$(QUANTA_IX8C_56X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix8c_bwde-r0 $(QUANTA_IX8C_56X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix8c_bwde-r0
$(eval $(call add_extra_package,$(QUANTA_IX1B_32X_PLATFORM_MODULE),$(QUANTA_IX8C_56X_PLATFORM_MODULE))) $(eval $(call add_extra_package,$(QUANTA_IX1B_32X_PLATFORM_MODULE),$(QUANTA_IX8C_56X_PLATFORM_MODULE)))

View File

@ -5,6 +5,20 @@ sonic-quanta-platform-modules (1.0) unstable; urgency=low
-- Chih-Pei Chang <Chih-Pei.Chang@qct.io> Jonathan Tsai <jonathan.tsai@quantatw.com> Wed, 20 Dec 2017 09:26:01 +0800 -- Chih-Pei Chang <Chih-Pei.Chang@qct.io> Jonathan Tsai <jonathan.tsai@quantatw.com> Wed, 20 Dec 2017 09:26:01 +0800
sonic-quanta-platform-modules (1.0) unstable; urgency=low
* Add support for Quanta IX7-32X
* Initial release
-- Chih-Pei Chang <Chih-Pei.Chang@qct.io> Jonathan Tsai <jonathan.tsai@quantatw.com> Tue, 17 Apr 2018 14:40:01 +0800
sonic-quanta-platform-modules (1.0) unstable; urgency=low
* Add support for Quanta IX8-56X
* Initial release
-- Chih-Pei Chang <Chih-Pei.Chang@qct.io> Jonathan Tsai <jonathan.tsai@quantatw.com> Thu, 3 May 2018 16:40:01 +0800
sonic-quanta-platform-modules (1.0) unstable; urgency=low sonic-quanta-platform-modules (1.0) unstable; urgency=low
* Add support for Quanta IX8C-56X * Add support for Quanta IX8C-56X

View File

@ -9,6 +9,14 @@ Package: sonic-platform-quanta-ix1b-32x
Architecture: amd64 Architecture: amd64
Description: kernel modules for platform devices such as psu, led, sfp Description: kernel modules for platform devices such as psu, led, sfp
Package: sonic-platform-quanta-ix7-32x
Architecture: amd64
Description: kernel modules for platform devices such as psu, led, sfp
Package: sonic-platform-quanta-ix8-56x
Architecture: amd64
Description: kernel modules for platform devices such as psu, led, sfp
Package: sonic-platform-quanta-ix8c-56x Package: sonic-platform-quanta-ix8c-56x
Architecture: amd64 Architecture: amd64
Description: kernel modules for platform devices such as psu, led, sfp Description: kernel modules for platform devices such as psu, led, sfp

View File

@ -19,7 +19,7 @@ PACKAGE_PRE_NAME := sonic-platform-quanta
KVERSION ?= $(shell uname -r) KVERSION ?= $(shell uname -r)
KERNEL_SRC := /lib/modules/$(KVERSION) KERNEL_SRC := /lib/modules/$(KVERSION)
MOD_SRC_DIR:= $(shell pwd) MOD_SRC_DIR:= $(shell pwd)
MODULE_DIRS:= ix1b-32x ix8c-56x MODULE_DIRS:= ix1b-32x ix7-32x ix8-56x ix8c-56x
MODULE_DIR := modules MODULE_DIR := modules
UTILS_DIR := utils UTILS_DIR := utils
SERVICE_DIR := service SERVICE_DIR := service

View File

@ -0,0 +1,3 @@
obj-m:=qci_cpld.o qci_cpld_led.o quanta_platform_ix7.o

View File

@ -0,0 +1,451 @@
/*
* A CPLD driver for monitor QSFP28 module I/O
*
* The CPLD is customize by Quanta for controlling QSFP28 module signals,
* they are RESET , INTERREPT , Module_Present, LPMODE
* Each CPLD control 16 modules, each module use 4 bits in register.
*
* Copyright (C) 2015 Quanta Inc.
*
* Author: Luffy Cheng <luffy.cheng@quantatw.com>
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/log2.h>
#include <linux/slab.h>
#include <linux/kdev_t.h>
#include <linux/idr.h>
#include <linux/ctype.h>
#include <linux/string.h>
static DEFINE_IDA(cpld_ida);
enum platform_type {
SFP = 0,
QSFP,
QSFP28,
NONE
};
static struct class *cpld_class = NULL;
struct sfp_data {
struct i2c_client *cpld_client;
char name[8];
char type[8];
u8 port_id;
u8 cpld_port;
};
struct cpld_data {
struct mutex lock;
struct device *port_dev[16];
struct sfp_data *port_data[16];
};
static int cpld_probe(struct i2c_client *client,
const struct i2c_device_id *id);
static int cpld_remove(struct i2c_client *client);
static const struct i2c_device_id cpld_id[] = {
{ "CPLD-SFP", SFP },
{ "CPLD-QSFP", QSFP },
{ "CPLD-QSFP28", QSFP28 },
{ }
};
MODULE_DEVICE_TABLE(i2c, cpld_id);
static struct i2c_driver cpld_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.name = "qci_cpld",
},
.probe = cpld_probe,
.remove = cpld_remove,
.id_table = cpld_id,
// .address_list = normal_i2c,
};
#define CPLD_ID_PREFIX "port-"
#define CPLD_ID_FORMAT CPLD_ID_PREFIX "%d"
#define RESET_MASK 0x08
#define INTERRUPT_MASK 0x04
#define MODULE_PRESENT_MASK 0x02
#define LPMODE_MASK 0x01
//#define I2C_MONITOR_MASK 0x01
static inline u8 get_group_cmd(u8 group)
{
//FIXME: if group cmd change
return (group + 1);
}
static inline u8 port_remapping(u8 phy_port)
{
/* FIXME: implement by hardware design */
/* The CPLD register port mapping is weird :
* MSB -------- LSB (word data)
* P3 P4 P1 P2 (per port 4 bits)
* For easy coding bit shift, we treat it as hw port swap
*/
return (phy_port % 2) ? (phy_port - 1) : (phy_port + 1);
}
static ssize_t get_reset(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= RESET_MASK;
return sprintf(buf, "%d\n", value ? 1 : 0);
}
static ssize_t get_interrupt(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= INTERRUPT_MASK;
return sprintf(buf, "%d\n", value ? 1 : 0);
}
static ssize_t get_module_present(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= MODULE_PRESENT_MASK;
//FIXME: if present is not low active
return sprintf(buf, "%d\n", value ? 0 : 1);
}
static ssize_t get_lpmode(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= LPMODE_MASK;
return sprintf(buf, "%d\n", value ? 1 : 0);
}
static ssize_t set_reset(struct device *dev,
struct device_attribute *devattr,
const char *buf,
size_t count)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
long disable;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
if (kstrtol(buf, 0, &disable))
return -EINVAL;
if ((disable != 1) && (disable != 0))
return -EINVAL;
// mutex_lock(&data->lock);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value &= ~(RESET_MASK << (group_port * 4));
if (disable)
value |= (RESET_MASK << (group_port * 4));
dev_dbg(&client->dev, "write group%d value= %x\n", group + 1, value);
i2c_smbus_write_word_data(client, get_group_cmd(group), (u16)value);
// mutex_unlock(&data->lock);
return count;
}
static ssize_t set_lpmode(struct device *dev,
struct device_attribute *devattr,
const char *buf,
size_t count)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
long disable;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
if (kstrtol(buf, 0, &disable))
return -EINVAL;
if ((disable != 1) && (disable != 0))
return -EINVAL;
// mutex_lock(&data->lock);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value &= ~(LPMODE_MASK << (group_port * 4));
if (disable)
value |= (LPMODE_MASK << (group_port * 4));
dev_dbg(&client->dev, "write group%d value= %x\n", group + 1, value);
i2c_smbus_write_word_data(client, get_group_cmd(group), (u16)value);
// mutex_unlock(&data->lock);
return count;
}
static DEVICE_ATTR(reset, S_IWUSR | S_IRUGO, get_reset, set_reset);
static DEVICE_ATTR(lpmode, S_IWUSR | S_IRUGO, get_lpmode, set_lpmode);
static DEVICE_ATTR(module_present, S_IRUGO, get_module_present, NULL);
static DEVICE_ATTR(interrupt, S_IRUGO, get_interrupt, NULL);
//static DEVICE_ATTR(led_enable, S_IWUSR | S_IRUGO, get_led_enable, set_led_enable);
//static DEVICE_ATTR(monitor_enable, S_IWUSR | S_IRUGO, get_monitor_enable, set_monitor_enable);
static const struct attribute *sfp_attrs[] = {
&dev_attr_reset.attr,
&dev_attr_lpmode.attr,
&dev_attr_module_present.attr,
&dev_attr_interrupt.attr,
// &dev_attr_led_enable.attr,
NULL,
};
static const struct attribute_group sfp_attr_group = {
.attrs = (struct attribute **) sfp_attrs,
};
static int cpld_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct cpld_data *data;
struct sfp_data *port_data;
// struct i2c_monitor_data *monitor_data;
struct device *port_dev;
// struct device *i2c_dev;
int port_nr, i=0, err, max_port_num;
char name[I2C_NAME_SIZE], type[I2C_NAME_SIZE];
printk("cpld cpld_probe\n");
while(id->name[i])
{
name[i]=tolower(id->name[i]);
i++;
}
name[i]='\0';
strncpy(type,name+5,strlen(name)-5);
type[strlen(name)-5]='\0';
if (!cpld_class)
{
cpld_class = class_create(THIS_MODULE, name);
if (IS_ERR(cpld_class)) {
pr_err("couldn't create sysfs class\n");
return PTR_ERR(cpld_class);
}
}
data = devm_kzalloc(&client->dev, sizeof(struct cpld_data),
GFP_KERNEL);
if (!data)
return -ENOMEM;
if(!strcmp(client->name, "CPLD-QSFP28")){
max_port_num = 16;
}
else{
max_port_num = 4;
}
/* register sfp port data to sysfs */
for (i = 0; i < max_port_num; i++)
{
port_nr = ida_simple_get(&cpld_ida, 1, 99, GFP_KERNEL);
if (port_nr < 0)
goto err_out;
port_data = kzalloc(sizeof(struct sfp_data), GFP_KERNEL);
port_dev = device_create(cpld_class, &client->dev, MKDEV(0,0), port_data, CPLD_ID_FORMAT, port_nr);
if (IS_ERR(port_dev)) {
err = PTR_ERR(port_dev);
printk("err_status\n");
}
data->port_dev[i] = port_dev;
data->port_data[i] = port_data;
strcpy(port_data->type, type);
dev_info(&client->dev, "Register %s port-%d\n", port_data->type , port_nr);
/* FIXME: implement Logical/Physical port remapping */
//port_data->cpld_port = i;
port_data->cpld_port = port_remapping(i);
sprintf(port_data->name, "port-%d", port_nr);
port_data->port_id = port_nr;
dev_set_drvdata(port_dev, port_data);
port_dev->init_name = port_data->name;
port_data->cpld_client = client;
err = sysfs_create_group(&port_dev->kobj, &sfp_attr_group);
// if (status) printk("err status\n");
}
i2c_set_clientdata(client, data);
mutex_init(&data->lock);
dev_info(&client->dev, "%s device found\n", client->name);
return 0;
err_out:
return port_nr;
}
/* FIXME: for older kernel doesn't with idr_is_empty function, implement here */
#if 1
static int idr_has_entry(int id, void *p, void *data)
{
return 1;
}
static bool cpld_idr_is_empty(struct idr *idp)
{
return !idr_for_each(idp, idr_has_entry, NULL);
}
#endif
static int cpld_remove(struct i2c_client *client)
{
struct cpld_data *data = i2c_get_clientdata(client);
int i, max_port_num;
// int id;
if(!strcmp(client->name, "CPLD-QSFP28")){
max_port_num = 16;
}
else{
max_port_num = 4;
}
for (i = (max_port_num - 1); i >= 0; i--)
{
dev_info(data->port_dev[i], "Remove %s port-%d\n", data->port_data[i]->type , data->port_data[i]->port_id);
device_unregister(data->port_dev[i]);
ida_simple_remove(&cpld_ida, data->port_data[i]->port_id);
kfree(data->port_data[i]);
}
if (cpld_idr_is_empty(&cpld_ida.idr))
class_destroy(cpld_class);
return 0;
}
module_i2c_driver(cpld_driver);
MODULE_AUTHOR("Luffy Cheng <luffy.cheng@quantatw.com>");
MODULE_DESCRIPTION("Quanta Switch QSFP28 CPLD driver");
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,275 @@
/*
* A LED CPLD driver for Quanta Switch Platform
*
* The CPLD is customize by Quanta for decode led bit stream,
* This driver modify from Quanta CPLD I/O driver.
*
* Copyright (C) 2015 Quanta Inc.
*
* Author: Luffy Cheng <luffy.cheng@quantatw.com>
* Author: Roger Chang <Roger.Chang@quantatw.com>
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/log2.h>
#include <linux/slab.h>
#include <linux/kdev_t.h>
#include <linux/idr.h>
static DEFINE_IDA(cpld_led_ida);
enum platform_type {
IX7 = 0,
IX8,
NONE
};
static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
u8 cpld_id;
};
struct cpld_led_data {
struct mutex lock;
struct device *port_dev;
struct cpld_data *cpld_data;
};
static int cpld_led_probe(struct i2c_client *client,
const struct i2c_device_id *id);
static int cpld_led_remove(struct i2c_client *client);
static const struct i2c_device_id cpld_led_id[] = {
{ "CPLDLED_IX7", IX7 },
{ "CPLDLED_IX8", IX8 },
{ }
};
MODULE_DEVICE_TABLE(i2c, cpld_led_id);
static struct i2c_driver cpld_led_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.name = "qci_cpld_led",
},
.probe = cpld_led_probe,
.remove = cpld_led_remove,
.id_table = cpld_led_id,
// .address_list = normal_i2c,
};
#define CPLD_LED_ID_PREFIX "CPLDLED-"
#define CPLD_LED_ID_FORMAT CPLD_LED_ID_PREFIX "%d"
#define CPLD_DECODER_OFFSET 0x4
#define CPLD_DECODER_MASK 0x1
#define CPLD_USERCODE_START_OFFSET 0x0
static ssize_t get_led_decode(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct cpld_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 offset = (u8)(CPLD_DECODER_OFFSET);
s32 value;
value = i2c_smbus_read_byte_data(client, offset);
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read led decode value= %x\n", value);
value &= CPLD_DECODER_MASK;
return sprintf(buf, "%d\n", (value == 0) ? 1 : 0);
}
static ssize_t get_usercode(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct cpld_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 i = 0;
s32 value = 0, reading = 0;
for (i = 0; i < 4; i++)
{
reading = i2c_smbus_read_byte_data(client, CPLD_USERCODE_START_OFFSET + i);
if (reading < 0)
return -ENODEV;
dev_dbg(&client->dev, "read led usercode reg %d value= %x\n", i, reading);
value |= reading << (24 - 8 * i);
}
return sprintf(buf, "%X\n", value);
}
static ssize_t set_led_decode(struct device *dev,
struct device_attribute *devattr,
const char *buf,
size_t count)
{
struct cpld_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
s32 value;
long enable;
if (kstrtol(buf, 0, &enable))
return -EINVAL;
if ((enable != 1) && (enable != 0))
return -EINVAL;
// mutex_lock(&data->lock);
value = i2c_smbus_read_byte_data(client, CPLD_DECODER_OFFSET);
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read led decode value= %x\n", value);
value |= CPLD_DECODER_MASK;
if (enable)
value &= ~CPLD_DECODER_MASK;
dev_dbg(&client->dev, "write led decode value= %x\n", value);
i2c_smbus_write_byte_data(client, CPLD_DECODER_OFFSET, (u8)value);
// mutex_unlock(&data->lock);
return count;
}
static DEVICE_ATTR(led_decode, S_IWUSR | S_IRUGO, get_led_decode, set_led_decode);
static DEVICE_ATTR(usercode, S_IRUGO, get_usercode, NULL);
static const struct attribute *led_attrs[] = {
&dev_attr_usercode.attr,
&dev_attr_led_decode.attr,
NULL,
};
static const struct attribute_group led_attr_group = {
.attrs = (struct attribute **) led_attrs,
};
static int cpld_led_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct cpld_led_data *data;
struct cpld_data *led_data;
struct device *port_dev;
int nr, err;
if (!cpld_class)
{
cpld_class = class_create(THIS_MODULE, "cpld-led");
if (IS_ERR(cpld_class)) {
pr_err("couldn't create sysfs class\n");
return PTR_ERR(cpld_class);
}
}
data = devm_kzalloc(&client->dev, sizeof(struct cpld_led_data),
GFP_KERNEL);
if (!data)
return -ENOMEM;
/* Test */
nr = ida_simple_get(&cpld_led_ida, 1, 99, GFP_KERNEL);
if (nr < 0)
goto err_out;
led_data = kzalloc(sizeof(struct cpld_led_data), GFP_KERNEL);
port_dev = device_create(cpld_class, &client->dev, MKDEV(0,0), led_data, CPLD_LED_ID_FORMAT, nr);
if (IS_ERR(port_dev)) {
err = PTR_ERR(port_dev);
// printk("err_status\n");
}
data->port_dev = port_dev;
data->cpld_data = led_data;
dev_info(&client->dev, "Register CPLDLED %d\n", nr);
sprintf(led_data->name, "LED%d-data", nr);
led_data->cpld_id = nr;
dev_set_drvdata(port_dev, led_data);
port_dev->init_name = led_data->name;
led_data->cpld_client = client;
err = sysfs_create_group(&port_dev->kobj, &led_attr_group);
// if (status) printk("err status\n");
/* end */
i2c_set_clientdata(client, data);
mutex_init(&data->lock);
dev_info(&client->dev, "%s device found\n", client->name);
return 0;
err_out:
return nr;
}
/* FIXME: for older kernel doesn't with idr_is_empty function, implement here */
static int idr_has_entry(int id, void *p, void *data)
{
return 1;
}
static bool cpld_idr_is_empty(struct idr *idp)
{
return !idr_for_each(idp, idr_has_entry, NULL);
}
static int cpld_led_remove(struct i2c_client *client)
{
struct cpld_led_data *data = i2c_get_clientdata(client);
dev_info(data->port_dev, "Remove CPLDLED-%d\n", data->cpld_data->cpld_id);
device_unregister(data->port_dev);
ida_simple_remove(&cpld_led_ida, data->cpld_data->cpld_id);
kfree(data->cpld_data);
if (cpld_idr_is_empty(&cpld_led_ida.idr))
class_destroy(cpld_class);
return 0;
}
module_i2c_driver(cpld_led_driver);
MODULE_AUTHOR("Luffy Cheng <luffy.cheng@quantatw.com>");
MODULE_AUTHOR("Roger Chang <Roger.Chang@quantatw.com>");
MODULE_DESCRIPTION("Quanta Switch LED CPLD driver");
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,323 @@
/*
* Quanta IX7 platform driver
*
*
* Copyright (C) 2014 Quanta Computer inc.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/err.h>
#include <linux/proc_fs.h>
#include <linux/backlight.h>
#include <linux/fb.h>
#include <linux/leds.h>
#include <linux/platform_device.h>
#include <linux/uaccess.h>
#include <linux/input.h>
#include <linux/input/sparse-keymap.h>
#include <linux/input-polldev.h>
#include <linux/rfkill.h>
#include <linux/slab.h>
#include <linux/i2c/pca954x.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))
#include <linux/i2c/pca953x.h>
#else
#include <linux/platform_data/pca953x.h>
#endif
#define MUX_INFO(bus, deselect) \
{.adap_id = bus, .deselect_on_exit = deselect}
static struct pca954x_platform_mode pca9548sfp1_modes[] = {
MUX_INFO(0x20, 1),
MUX_INFO(0x21, 1),
MUX_INFO(0x22, 1),
MUX_INFO(0x23, 1),
MUX_INFO(0x24, 1),
MUX_INFO(0x25, 1),
MUX_INFO(0x26, 1),
MUX_INFO(0x27, 1),
};
static struct pca954x_platform_data pca9548sfp1_data = {
.modes = pca9548sfp1_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp2_modes[] = {
MUX_INFO(0x28, 1),
MUX_INFO(0x29, 1),
MUX_INFO(0x2a, 1),
MUX_INFO(0x2b, 1),
MUX_INFO(0x2c, 1),
MUX_INFO(0x2d, 1),
MUX_INFO(0x2e, 1),
MUX_INFO(0x2f, 1),
};
static struct pca954x_platform_data pca9548sfp2_data = {
.modes = pca9548sfp2_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp3_modes[] = {
MUX_INFO(0x30, 1),
MUX_INFO(0x31, 1),
MUX_INFO(0x32, 1),
MUX_INFO(0x33, 1),
MUX_INFO(0x34, 1),
MUX_INFO(0x35, 1),
MUX_INFO(0x36, 1),
MUX_INFO(0x37, 1),
};
static struct pca954x_platform_data pca9548sfp3_data = {
.modes = pca9548sfp3_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp4_modes[] = {
MUX_INFO(0x38, 1),
MUX_INFO(0x39, 1),
MUX_INFO(0x3a, 1),
MUX_INFO(0x3b, 1),
MUX_INFO(0x3c, 1),
MUX_INFO(0x3d, 1),
MUX_INFO(0x3e, 1),
MUX_INFO(0x3f, 1),
};
static struct pca954x_platform_data pca9548sfp4_data = {
.modes = pca9548sfp4_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9546_modes[] = {
MUX_INFO(0x10, 1),
MUX_INFO(0x11, 1),
MUX_INFO(0x12, 1),
MUX_INFO(0x13, 1),
};
static struct pca954x_platform_data pca9546_data = {
.modes = pca9546_modes,
.num_modes = 4,
};
static struct pca954x_platform_mode pca9548_modes[] = {
MUX_INFO(0x14, 1),
MUX_INFO(0x15, 1),
MUX_INFO(0x16, 1),
MUX_INFO(0x17, 1),
MUX_INFO(0x18, 1),
MUX_INFO(0x19, 1),
MUX_INFO(0x1a, 1),
MUX_INFO(0x1b, 1),
};
static struct pca954x_platform_data pca9548_data = {
.modes = pca9548_modes,
.num_modes = 8,
};
/* CPU Board i2c device */
static struct pca954x_platform_mode pca9546_cpu_modes[] = {
MUX_INFO(0x02, 1),
MUX_INFO(0x03, 1),
MUX_INFO(0x04, 1),
MUX_INFO(0x05, 1),
};
static struct pca954x_platform_data pca9546_cpu_data = {
.modes = pca9546_cpu_modes,
.num_modes = 4,
};
//MB Board Data
static struct pca953x_platform_data pca9555_1_data = {
.gpio_base = 0x10,
};
//CPU Board pca9555
static struct pca953x_platform_data pca9555_CPU_data = {
.gpio_base = 0x20,
};
static struct i2c_board_info ix7_i2c_devices[] = {
{
I2C_BOARD_INFO("pca9546", 0x72), // 0
.platform_data = &pca9546_data,
},
{
I2C_BOARD_INFO("pca9548", 0x77), // 1
.platform_data = &pca9548_data,
},
{
I2C_BOARD_INFO("24c02", 0x54), // 2 0x72 ch2 eeprom
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 3 0x77 ch0
.platform_data = &pca9548sfp1_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 4 0x77 ch1
.platform_data = &pca9548sfp2_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 5 0x77 ch2
.platform_data = &pca9548sfp3_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 6 0x77 ch3
.platform_data = &pca9548sfp4_data,
},
{
I2C_BOARD_INFO("pca9555", 0x23), // 7 0x72 ch3 pca9555 MB Board Data
.platform_data = &pca9555_1_data,
},
{
I2C_BOARD_INFO("CPLD-QSFP28", 0x38), // 8 0x72 ch0
},
{
I2C_BOARD_INFO("CPLD-QSFP28", 0x38), // 9 0x72 ch1
},
{
I2C_BOARD_INFO("pca9546", 0x71), // 10 CPU Board i2c device
.platform_data = &pca9546_cpu_data,
},
{
I2C_BOARD_INFO("pca9555", 0x20), // 11 0x71 ch0 CPU Board Data
.platform_data = &pca9555_CPU_data,
},
{
I2C_BOARD_INFO("optoe1", 0x50), // 12 0x50 QSFP EEPROM
},
{
I2C_BOARD_INFO("CPLDLED_IX7", 0x39), // 13 0x72 ch0 CPLD_led_1
},
{
I2C_BOARD_INFO("CPLDLED_IX7", 0x39), // 14 0x72 ch1 CPLD_led_1
},
};
static struct platform_driver ix7_platform_driver = {
.driver = {
.name = "qci-ix7",
.owner = THIS_MODULE,
},
};
static struct platform_device *ix7_device;
static int __init ix7_platform_init(void)
{
struct i2c_client *client;
struct i2c_adapter *adapter;
int ret, i;
ret = platform_driver_register(&ix7_platform_driver);
if (ret < 0)
return ret;
/* Register platform stuff */
ix7_device = platform_device_alloc("qci-ix7", -1);
if (!ix7_device) {
ret = -ENOMEM;
goto fail_platform_driver;
}
ret = platform_device_add(ix7_device);
if (ret)
goto fail_platform_device;
adapter = i2c_get_adapter(0);
client = i2c_new_device(adapter, &ix7_i2c_devices[0]); // pca9546
client = i2c_new_device(adapter, &ix7_i2c_devices[1]); // pca9548
client = i2c_new_device(adapter, &ix7_i2c_devices[10]); // pca9546 in CPU board
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x02);
client = i2c_new_device(adapter, &ix7_i2c_devices[11]); // CPU Board Data
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x10);
client = i2c_new_device(adapter, &ix7_i2c_devices[8]); // CPLD2
client = i2c_new_device(adapter, &ix7_i2c_devices[13]); // CPLD_led_1
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x11);
client = i2c_new_device(adapter, &ix7_i2c_devices[9]); // CPLD3
client = i2c_new_device(adapter, &ix7_i2c_devices[14]); // CPLD_led_2
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x12);
client = i2c_new_device(adapter, &ix7_i2c_devices[2]); // MB_BOARDINFO_EEPROM
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x13);
client = i2c_new_device(adapter, &ix7_i2c_devices[7]); // pca9555 MB Board Data
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x14);
client = i2c_new_device(adapter, &ix7_i2c_devices[3]); // pca9548_1 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x15);
client = i2c_new_device(adapter, &ix7_i2c_devices[4]); // pca9548_2 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x16);
client = i2c_new_device(adapter, &ix7_i2c_devices[5]); // pca9548_3 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x17);
client = i2c_new_device(adapter, &ix7_i2c_devices[6]); // pca9548_4 SFP
i2c_put_adapter(adapter);
for(i = 32; i < 64; i ++){ // QSFP 1~32 EEPROM
adapter = i2c_get_adapter(i);
client = i2c_new_device(adapter, &ix7_i2c_devices[12]);
i2c_put_adapter(adapter);
}
return 0;
fail_platform_device:
platform_device_put(ix7_device);
fail_platform_driver:
platform_driver_unregister(&ix7_platform_driver);
return ret;
}
static void __exit ix7_platform_exit(void)
{
platform_device_unregister(ix7_device);
platform_driver_unregister(&ix7_platform_driver);
}
module_init(ix7_platform_init);
module_exit(ix7_platform_exit);
MODULE_AUTHOR("Jonathan Tsai <jonathan.tsai@quantatw.com>");
MODULE_VERSION("1.0");
MODULE_DESCRIPTION("Quanta IX7 Platform Driver");
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,13 @@
[Unit]
Description=Quanta IX7-32X Platform initialization service
Before=pmon.service
DefaultDependencies=no
[Service]
Type=oneshot
ExecStart=/usr/local/bin/quanta_ix7_util.py install
ExecStop=/usr/local/bin/quanta_ix7_util.py clean
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,16 @@
#!/usr/bin/env python
import os
import sys
from setuptools import setup
os.listdir
setup(
name='ix7_32x',
version='1.0',
description='Module to initialize Quanta IX7-32X platforms',
packages=['ix7_32x'],
package_dir={'ix7_32x': 'ix7-32x/classes'},
)

View File

@ -0,0 +1,210 @@
#!/usr/bin/env python
#
# Copyright (C) 2018 Quanta Computer Inc.
#
# 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/>.
"""
Usage: %(scriptName)s [options] command object
options:
-h | --help : this help message
-d | --debug : run with debug mode
-f | --force : ignore error during installation or clean
command:
install : install drivers and generate related sysfs nodes
clean : uninstall drivers and remove related sysfs nodes
"""
import os
import commands
import sys, getopt
import logging
import re
import time
from collections import namedtuple
DEBUG = False
args = []
FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
def main():
global DEBUG
global args
global FORCE
if len(sys.argv)<2:
show_help()
options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
'debug',
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
for opt, arg in options:
if opt in ('-h', '--help'):
show_help()
elif opt in ('-d', '--debug'):
DEBUG = True
logging.basicConfig(level=logging.INFO)
elif opt in ('-f', '--force'):
FORCE = 1
else:
logging.info('no option')
for arg in args:
if arg == 'install':
install()
elif arg == 'clean':
uninstall()
else:
show_help()
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX7-32X]"+txt
return
def exec_cmd(cmd, show):
logging.info('Run :'+cmd)
status, output = commands.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:"+output)
if status:
logging.info('Failed :'+cmd)
if show:
print('Failed :'+cmd)
return status, output
instantiate =[
#turn on module power
'echo 21 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio21/direction',
'echo 1 >/sys/class/gpio/gpio21/value',
#Reset fron-ports LED CPLD
'echo 73 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio73/direction',
'echo 0 >/sys/class/gpio/gpio73/value',
'echo 1 >/sys/class/gpio/gpio73/value',
#Enable front-ports LED decoding
'echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode',
'echo 1 > /sys/class/cpld-led/CPLDLED-2/led_decode',
#Update System LED
'echo 42 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio42/direction',
'echo 0 > /sys/class/gpio/gpio42/value',
'echo 43 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio43/direction',
'echo 1 > /sys/class/gpio/gpio43/value',
]
drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld',
'qci_cpld_led',
'quanta_platform_ix7',
'ipmi_devintf'
]
def system_install():
global FORCE
#remove default drivers to avoid modprobe order conflicts
status, output = exec_cmd("echo 'blacklist i2c-ismt' > /etc/modprobe.d/blacklist.conf", 1)
time.sleep(1)
status, output = exec_cmd("modprobe -r i2c-ismt ", 1)
status, output = exec_cmd("modprobe -r i2c-i801 ", 1)
#setup driver dependency
status, output = exec_cmd("depmod -a ", 1)
#install drivers
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe "+drivers[i], 1)
if status:
print output
if FORCE == 0:
return status
#instantiate devices
for i in range(0,len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
if FORCE == 0:
return status
#QSFP for 1~32 port
for port_number in range(1,33):
bus_number = port_number + 31
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
return
def system_ready():
if not device_found():
return False
return True
def install():
if not device_found():
print "No device, installing...."
status = system_install()
if status:
if FORCE == 0:
return status
else:
print " ix7 driver already installed...."
return
def uninstall():
global FORCE
#uninstall drivers
for i in range(len(drivers)-1,-1,-1):
status, output = exec_cmd("rmmod "+drivers[i], 1)
if status:
print output
if FORCE == 0:
return status
return
def device_found():
ret1, log = exec_cmd("ls "+i2c_prefix+"i2c-0", 0)
return ret1
if __name__ == "__main__":
main()

View File

@ -0,0 +1,3 @@
obj-m:=qci_cpld_sfp28.o qci_cpld_led.o qci_platform_ix8.o

View File

@ -0,0 +1,275 @@
/*
* A LED CPLD driver for Quanta Switch Platform
*
* The CPLD is customize by Quanta for decode led bit stream,
* This driver modify from Quanta CPLD I/O driver.
*
* Copyright (C) 2015 Quanta Inc.
*
* Author: Luffy Cheng <luffy.cheng@quantatw.com>
* Author: Roger Chang <Roger.Chang@quantatw.com>
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/log2.h>
#include <linux/slab.h>
#include <linux/kdev_t.h>
#include <linux/idr.h>
static DEFINE_IDA(cpld_led_ida);
enum platform_type {
IX7 = 0,
IX8,
NONE
};
static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
u8 cpld_id;
};
struct cpld_led_data {
struct mutex lock;
struct device *port_dev;
struct cpld_data *cpld_data;
};
static int cpld_led_probe(struct i2c_client *client,
const struct i2c_device_id *id);
static int cpld_led_remove(struct i2c_client *client);
static const struct i2c_device_id cpld_led_id[] = {
{ "CPLDLED_IX7", IX7 },
{ "CPLDLED_IX8", IX8 },
{ }
};
MODULE_DEVICE_TABLE(i2c, cpld_led_id);
static struct i2c_driver cpld_led_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.name = "qci_cpld_led",
},
.probe = cpld_led_probe,
.remove = cpld_led_remove,
.id_table = cpld_led_id,
// .address_list = normal_i2c,
};
#define CPLD_LED_ID_PREFIX "CPLDLED-"
#define CPLD_LED_ID_FORMAT CPLD_LED_ID_PREFIX "%d"
#define CPLD_DECODER_OFFSET 0x4
#define CPLD_DECODER_MASK 0x1
#define CPLD_USERCODE_START_OFFSET 0x0
static ssize_t get_led_decode(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct cpld_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 offset = (u8)(CPLD_DECODER_OFFSET);
s32 value;
value = i2c_smbus_read_byte_data(client, offset);
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read led decode value= %x\n", value);
value &= CPLD_DECODER_MASK;
return sprintf(buf, "%d\n", (value == 0) ? 1 : 0);
}
static ssize_t get_usercode(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct cpld_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 i = 0;
s32 value = 0, reading = 0;
for (i = 0; i < 4; i++)
{
reading = i2c_smbus_read_byte_data(client, CPLD_USERCODE_START_OFFSET + i);
if (reading < 0)
return -ENODEV;
dev_dbg(&client->dev, "read led usercode reg %d value= %x\n", i, reading);
value |= reading << (24 - 8 * i);
}
return sprintf(buf, "%X\n", value);
}
static ssize_t set_led_decode(struct device *dev,
struct device_attribute *devattr,
const char *buf,
size_t count)
{
struct cpld_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
s32 value;
long enable;
if (kstrtol(buf, 0, &enable))
return -EINVAL;
if ((enable != 1) && (enable != 0))
return -EINVAL;
// mutex_lock(&data->lock);
value = i2c_smbus_read_byte_data(client, CPLD_DECODER_OFFSET);
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read led decode value= %x\n", value);
value |= CPLD_DECODER_MASK;
if (enable)
value &= ~CPLD_DECODER_MASK;
dev_dbg(&client->dev, "write led decode value= %x\n", value);
i2c_smbus_write_byte_data(client, CPLD_DECODER_OFFSET, (u8)value);
// mutex_unlock(&data->lock);
return count;
}
static DEVICE_ATTR(led_decode, S_IWUSR | S_IRUGO, get_led_decode, set_led_decode);
static DEVICE_ATTR(usercode, S_IRUGO, get_usercode, NULL);
static const struct attribute *led_attrs[] = {
&dev_attr_usercode.attr,
&dev_attr_led_decode.attr,
NULL,
};
static const struct attribute_group led_attr_group = {
.attrs = (struct attribute **) led_attrs,
};
static int cpld_led_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct cpld_led_data *data;
struct cpld_data *led_data;
struct device *port_dev;
int nr, err;
if (!cpld_class)
{
cpld_class = class_create(THIS_MODULE, "cpld-led");
if (IS_ERR(cpld_class)) {
pr_err("couldn't create sysfs class\n");
return PTR_ERR(cpld_class);
}
}
data = devm_kzalloc(&client->dev, sizeof(struct cpld_led_data),
GFP_KERNEL);
if (!data)
return -ENOMEM;
/* Test */
nr = ida_simple_get(&cpld_led_ida, 1, 99, GFP_KERNEL);
if (nr < 0)
goto err_out;
led_data = kzalloc(sizeof(struct cpld_led_data), GFP_KERNEL);
port_dev = device_create(cpld_class, &client->dev, MKDEV(0,0), led_data, CPLD_LED_ID_FORMAT, nr);
if (IS_ERR(port_dev)) {
err = PTR_ERR(port_dev);
// printk("err_status\n");
}
data->port_dev = port_dev;
data->cpld_data = led_data;
dev_info(&client->dev, "Register CPLDLED %d\n", nr);
sprintf(led_data->name, "LED%d-data", nr);
led_data->cpld_id = nr;
dev_set_drvdata(port_dev, led_data);
port_dev->init_name = led_data->name;
led_data->cpld_client = client;
err = sysfs_create_group(&port_dev->kobj, &led_attr_group);
// if (status) printk("err status\n");
/* end */
i2c_set_clientdata(client, data);
mutex_init(&data->lock);
dev_info(&client->dev, "%s device found\n", client->name);
return 0;
err_out:
return nr;
}
/* FIXME: for older kernel doesn't with idr_is_empty function, implement here */
static int idr_has_entry(int id, void *p, void *data)
{
return 1;
}
static bool cpld_idr_is_empty(struct idr *idp)
{
return !idr_for_each(idp, idr_has_entry, NULL);
}
static int cpld_led_remove(struct i2c_client *client)
{
struct cpld_led_data *data = i2c_get_clientdata(client);
dev_info(data->port_dev, "Remove CPLDLED-%d\n", data->cpld_data->cpld_id);
device_unregister(data->port_dev);
ida_simple_remove(&cpld_led_ida, data->cpld_data->cpld_id);
kfree(data->cpld_data);
if (cpld_idr_is_empty(&cpld_led_ida.idr))
class_destroy(cpld_class);
return 0;
}
module_i2c_driver(cpld_led_driver);
MODULE_AUTHOR("Luffy Cheng <luffy.cheng@quantatw.com>");
MODULE_AUTHOR("Roger Chang <Roger.Chang@quantatw.com>");
MODULE_DESCRIPTION("Quanta Switch LED CPLD driver");
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,398 @@
/*
* A CPLD driver for monitor SFP28 module I/O
*
* The CPLD is customize by Quanta for controlling SFP28 module signals,
* they are TX_FAULT , TX_DIS , PRE_N , RX_LOS
* Each CPLD control 16 modules, each module use 4 bits in register.
*
* Copyright (C) 2015 Quanta Inc.
*
* Author: Luffy Cheng <luffy.cheng@quantatw.com>
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/log2.h>
#include <linux/slab.h>
#include <linux/kdev_t.h>
#include <linux/idr.h>
#include <linux/ctype.h>
#include <linux/string.h>
static DEFINE_IDA(cpld_ida);
enum platform_type {
SFP = 0,
SFP28,
NONE
};
static struct class *cpld_class = NULL;
struct sfp_data {
struct i2c_client *cpld_client;
char name[8];
char type[8];
u8 port_id;
u8 cpld_port;
};
struct cpld_data {
struct mutex lock;
struct device *port_dev[16];
struct sfp_data *port_data[16];
};
static int cpld_probe(struct i2c_client *client,
const struct i2c_device_id *id);
static int cpld_remove(struct i2c_client *client);
static const struct i2c_device_id cpld_id[] = {
{ "CPLD-SFP", SFP },
{ "CPLD-SFP28", SFP28 },
{ }
};
MODULE_DEVICE_TABLE(i2c, cpld_id);
static struct i2c_driver cpld_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.name = "qci_cpld_sfp28",
},
.probe = cpld_probe,
.remove = cpld_remove,
.id_table = cpld_id,
// .address_list = normal_i2c,
};
#define CPLD_ID_PREFIX "port-"
#define CPLD_ID_FORMAT CPLD_ID_PREFIX "%d"
//SFP28
#define TX_FAULT_MASK 0x08
#define TX_DIS_MASK 0x04
#define PRE_N_MASK 0x02
#define RX_LOS_MASK 0x01
static inline u8 get_group_cmd(u8 group)
{
//FIXME: if group cmd change
return (group + 1);
}
static inline u8 port_remapping(u8 phy_port)
{
/* FIXME: implement by hardware design */
/* The CPLD register port mapping is weird :
* MSB -------- LSB (word data)
* P3 P4 P1 P2 (per port 4 bits)
* For easy coding bit shift, we treat it as hw port swap
*/
return (phy_port % 2) ? (phy_port - 1) : (phy_port + 1);
}
//SFP
static ssize_t get_tx_fault(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= TX_FAULT_MASK;
return sprintf(buf, "%d\n", value ? 1 : 0);
}
static ssize_t get_tx_dis(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= TX_DIS_MASK;
return sprintf(buf, "%d\n", value ? 1 : 0);
}
static ssize_t get_pre_n(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= PRE_N_MASK;
//FIXME: if present is not low active
return sprintf(buf, "%d\n", value ? 0 : 1);
}
static ssize_t get_rx_los(struct device *dev,
struct device_attribute *devattr,
char *buf)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value >>= (group_port * 4);
value &= RX_LOS_MASK;
return sprintf(buf, "%d\n", value ? 1 : 0);
}
static ssize_t set_tx_dis(struct device *dev,
struct device_attribute *devattr,
const char *buf,
size_t count)
{
struct sfp_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->cpld_client;
u8 group = (u8)(data->cpld_port / 4);
u8 group_port = data->cpld_port % 4;
s32 value;
long disable;
dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id,
data->cpld_port + 1, group + 1, group_port + 1);
if (kstrtol(buf, 0, &disable))
return -EINVAL;
if ((disable != 1) && (disable != 0))
return -EINVAL;
// mutex_lock(&data->lock);
value = i2c_smbus_read_word_data(client, get_group_cmd(group));
if (value < 0)
return -ENODEV;
dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value);
value &= ~(TX_DIS_MASK << (group_port * 4));
if (disable)
value |= (TX_DIS_MASK << (group_port * 4));
dev_dbg(&client->dev, "write group%d value= %x\n", group + 1, value);
i2c_smbus_write_word_data(client, get_group_cmd(group), (u16)value);
// mutex_unlock(&data->lock);
return count;
}
//SFP
//static DEVICE_ATTR(led_enable, S_IWUSR | S_IRUGO, get_led_enable, set_led_enable);
//static DEVICE_ATTR(monitor_enable, S_IWUSR | S_IRUGO, get_monitor_enable, set_monitor_enable);
//SFP
static DEVICE_ATTR(tx_fault, S_IRUGO, get_tx_fault, NULL);
static DEVICE_ATTR(tx_dis, S_IWUSR | S_IRUGO, get_tx_dis, set_tx_dis);
static DEVICE_ATTR(pre_n, S_IRUGO, get_pre_n, NULL);
static DEVICE_ATTR(rx_los, S_IRUGO, get_rx_los, NULL);
static const struct attribute *sfp_attrs[] = {
// &dev_attr_led_enable.attr,
&dev_attr_tx_fault.attr,
&dev_attr_tx_dis.attr,
&dev_attr_pre_n.attr,
&dev_attr_rx_los.attr,
NULL,
};
static const struct attribute_group sfp_attr_group = {
.attrs = (struct attribute **) sfp_attrs,
};
static int cpld_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct cpld_data *data;
struct sfp_data *port_data;
// struct i2c_monitor_data *monitor_data;
struct device *port_dev;
// struct device *i2c_dev;
int port_nr, i=0, err;
char name[I2C_NAME_SIZE], type[I2C_NAME_SIZE];
printk("cpld cpld_probe\n");
while(id->name[i])
{
name[i]=tolower(id->name[i]);
i++;
}
name[i]='\0';
strncpy(type,name+5,strlen(name)-5);
type[strlen(name)-5]='\0';
if (!cpld_class)
{
cpld_class = class_create(THIS_MODULE, name);
if (IS_ERR(cpld_class)) {
pr_err("couldn't create sysfs class\n");
return PTR_ERR(cpld_class);
}
}
data = devm_kzalloc(&client->dev, sizeof(struct cpld_data),
GFP_KERNEL);
if (!data)
return -ENOMEM;
/* register sfp port data to sysfs */
for (i = 0; i < 16; i++)
{
port_nr = ida_simple_get(&cpld_ida, 1, 99, GFP_KERNEL);
if (port_nr < 0)
goto err_out;
port_data = kzalloc(sizeof(struct sfp_data), GFP_KERNEL);
port_dev = device_create(cpld_class, &client->dev, MKDEV(0,0), port_data, CPLD_ID_FORMAT, port_nr);
if (IS_ERR(port_dev)) {
err = PTR_ERR(port_dev);
printk("err_status\n");
}
data->port_dev[i] = port_dev;
data->port_data[i] = port_data;
strcpy(port_data->type, type);
dev_info(&client->dev, "Register %s port-%d\n", port_data->type , port_nr);
/* FIXME: implement Logical/Physical port remapping */
//port_data->cpld_port = i;
port_data->cpld_port = port_remapping(i);
sprintf(port_data->name, "port-%d", port_nr);
port_data->port_id = port_nr;
dev_set_drvdata(port_dev, port_data);
port_dev->init_name = port_data->name;
port_data->cpld_client = client;
err = sysfs_create_group(&port_dev->kobj, &sfp_attr_group);
// if (status) printk("err status\n");
}
i2c_set_clientdata(client, data);
mutex_init(&data->lock);
dev_info(&client->dev, "%s device found\n", client->name);
return 0;
err_out:
return port_nr;
}
/* FIXME: for older kernel doesn't with idr_is_empty function, implement here */
#if 1
static int idr_has_entry(int id, void *p, void *data)
{
return 1;
}
static bool cpld_idr_is_empty(struct idr *idp)
{
return !idr_for_each(idp, idr_has_entry, NULL);
}
#endif
static int cpld_remove(struct i2c_client *client)
{
struct cpld_data *data = i2c_get_clientdata(client);
int i;
// int id;
for (i = 15; i >= 0; i--)
{
dev_info(data->port_dev[i], "Remove %s port-%d\n", data->port_data[i]->type , data->port_data[i]->port_id);
device_unregister(data->port_dev[i]);
ida_simple_remove(&cpld_ida, data->port_data[i]->port_id);
kfree(data->port_data[i]);
}
if (cpld_idr_is_empty(&cpld_ida.idr))
class_destroy(cpld_class);
return 0;
}
module_i2c_driver(cpld_driver);
MODULE_AUTHOR("Jonathan Tsai <jonathan.tsai@quantatw.com>");
MODULE_VERSION("1.0");
MODULE_DESCRIPTION("Quanta Switch SFP28 CPLD driver");
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,420 @@
/*
* Quanta IX8 platform driver
*
*
* Copyright (C) 2017 Quanta Computer inc.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/err.h>
#include <linux/proc_fs.h>
#include <linux/backlight.h>
#include <linux/fb.h>
#include <linux/leds.h>
#include <linux/platform_device.h>
#include <linux/uaccess.h>
#include <linux/input.h>
#include <linux/input/sparse-keymap.h>
#include <linux/input-polldev.h>
#include <linux/rfkill.h>
#include <linux/slab.h>
#include <linux/i2c/pca954x.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))
#include <linux/i2c/pca953x.h>
#else
#include <linux/platform_data/pca953x.h>
#endif
#define MUX_INFO(bus, deselect) \
{.adap_id = bus, .deselect_on_exit = deselect}
static struct pca954x_platform_mode pca9548sfp1_modes[] = {
MUX_INFO(0x20, 1),
MUX_INFO(0x21, 1),
MUX_INFO(0x22, 1),
MUX_INFO(0x23, 1),
MUX_INFO(0x24, 1),
MUX_INFO(0x25, 1),
MUX_INFO(0x26, 1),
MUX_INFO(0x27, 1),
};
static struct pca954x_platform_data pca9548sfp1_data = {
.modes = pca9548sfp1_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp2_modes[] = {
MUX_INFO(0x28, 1),
MUX_INFO(0x29, 1),
MUX_INFO(0x2a, 1),
MUX_INFO(0x2b, 1),
MUX_INFO(0x2c, 1),
MUX_INFO(0x2d, 1),
MUX_INFO(0x2e, 1),
MUX_INFO(0x2f, 1),
};
static struct pca954x_platform_data pca9548sfp2_data = {
.modes = pca9548sfp2_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp3_modes[] = {
MUX_INFO(0x30, 1),
MUX_INFO(0x31, 1),
MUX_INFO(0x32, 1),
MUX_INFO(0x33, 1),
MUX_INFO(0x34, 1),
MUX_INFO(0x35, 1),
MUX_INFO(0x36, 1),
MUX_INFO(0x37, 1),
};
static struct pca954x_platform_data pca9548sfp3_data = {
.modes = pca9548sfp3_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp4_modes[] = {
MUX_INFO(0x38, 1),
MUX_INFO(0x39, 1),
MUX_INFO(0x3a, 1),
MUX_INFO(0x3b, 1),
MUX_INFO(0x3c, 1),
MUX_INFO(0x3d, 1),
MUX_INFO(0x3e, 1),
MUX_INFO(0x3f, 1),
};
static struct pca954x_platform_data pca9548sfp4_data = {
.modes = pca9548sfp4_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp5_modes[] = {
MUX_INFO(0x40, 1),
MUX_INFO(0x41, 1),
MUX_INFO(0x42, 1),
MUX_INFO(0x43, 1),
MUX_INFO(0x44, 1),
MUX_INFO(0x45, 1),
MUX_INFO(0x46, 1),
MUX_INFO(0x47, 1),
};
static struct pca954x_platform_data pca9548sfp5_data = {
.modes = pca9548sfp5_modes,
.num_modes = 8,
};
static struct pca954x_platform_mode pca9548sfp6_modes[] = {
MUX_INFO(0x48, 1),
MUX_INFO(0x49, 1),
MUX_INFO(0x4a, 1),
MUX_INFO(0x4b, 1),
MUX_INFO(0x4c, 1),
MUX_INFO(0x4d, 1),
MUX_INFO(0x4e, 1),
MUX_INFO(0x4f, 1),
};
static struct pca954x_platform_data pca9548sfp6_data = {
.modes = pca9548sfp6_modes,
.num_modes = 8,
};
//ZQSFP
static struct pca954x_platform_mode pca9548sfp7_modes[] = {
MUX_INFO(0x50, 1),
MUX_INFO(0x51, 1),
MUX_INFO(0x52, 1),
MUX_INFO(0x53, 1),
MUX_INFO(0x54, 1),
MUX_INFO(0x55, 1),
MUX_INFO(0x56, 1),
MUX_INFO(0x57, 1),
};
static struct pca954x_platform_data pca9548sfp7_data = {
.modes = pca9548sfp7_modes,
.num_modes = 8,
};
// end port
static struct pca954x_platform_mode pca9546_modes[] = {
MUX_INFO(0x10, 1),
MUX_INFO(0x11, 1),
MUX_INFO(0x12, 1),
MUX_INFO(0x13, 1),
};
static struct pca954x_platform_data pca9546_data = {
.modes = pca9546_modes,
.num_modes = 4,
};
static struct pca954x_platform_mode pca9548_modes[] = {
MUX_INFO(0x14, 1),
MUX_INFO(0x15, 1),
MUX_INFO(0x16, 1),
MUX_INFO(0x17, 1),
MUX_INFO(0x18, 1),
MUX_INFO(0x19, 1),
MUX_INFO(0x1a, 1),
MUX_INFO(0x1b, 1),
};
static struct pca954x_platform_data pca9548_data = {
.modes = pca9548_modes,
.num_modes = 8,
};
/* CPU Board i2c device */
static struct pca954x_platform_mode pca9546_cpu_modes[] = {
MUX_INFO(0x02, 1),
MUX_INFO(0x03, 1),
MUX_INFO(0x04, 1),
MUX_INFO(0x05, 1),
};
static struct pca954x_platform_data pca9546_cpu_data = {
.modes = pca9546_cpu_modes,
.num_modes = 4,
};
//MB Board Data
static struct pca953x_platform_data pca9555_1_data = {
.gpio_base = 0x10,
};
//QSFP28 49-56 IO Expander
static struct pca953x_platform_data pca9698_2_data = {
.gpio_base = 0x20,
};
//CPU Board pca9555
static struct pca953x_platform_data pca9555_CPU_data = {
.gpio_base = 0x48,
};
static struct i2c_board_info ix8_i2c_devices[] = {
{
I2C_BOARD_INFO("pca9546", 0x72), // 0
.platform_data = &pca9546_data,
},
{
I2C_BOARD_INFO("pca9548", 0x77), // 1
.platform_data = &pca9548_data,
},
{
I2C_BOARD_INFO("24c02", 0x54), // 2 eeprom
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 3 0x77 ch0
.platform_data = &pca9548sfp1_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 4 0x77 ch1
.platform_data = &pca9548sfp2_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 5 0x77 ch2
.platform_data = &pca9548sfp3_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 6 0x77 ch3
.platform_data = &pca9548sfp4_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 7 0x77 ch4
.platform_data = &pca9548sfp5_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 8 0x77 ch5
.platform_data = &pca9548sfp6_data,
},
{
I2C_BOARD_INFO("pca9548", 0x73), // 9 0x77 ch6
.platform_data = &pca9548sfp7_data,
},
{
I2C_BOARD_INFO("CPLD-SFP28", 0x38), // 10 0x72 ch0 CPLD1_:SFP28 1~16
},
{
I2C_BOARD_INFO("CPLD-SFP28", 0x38), // 11 0x72 ch1 CPLD2_:SFP28 17~32
},
{
I2C_BOARD_INFO("CPLD-SFP28", 0x38), // 12 0x72 ch2 CPLD_3:SFP28 33~48
},
{
I2C_BOARD_INFO("pca9555", 0x23), // 13 0x72 ch3 MB Board Data
.platform_data = &pca9555_1_data,
},
{
I2C_BOARD_INFO("pca9698", 0x21), // 14 0x72 ch3 QSFP:49~52
.platform_data = &pca9698_2_data,
},
{
I2C_BOARD_INFO("optoe1", 0x50), // 15 0x50 QSFP EEPROM
},
{
I2C_BOARD_INFO("pca9546", 0x71), // 16
.platform_data = &pca9546_cpu_data,
},
{
I2C_BOARD_INFO("pca9555", 0x20), // 17 0x71 ch0 CPU Board Data
.platform_data = &pca9555_CPU_data,
},
{
I2C_BOARD_INFO("CPLDLED_IX8", 0x3a), // 18 0x72 ch0 CPLD4 LED function of SFP28 & QSFP28 (Port27~56)
},
{
I2C_BOARD_INFO("CPLDLED_IX8", 0x39), // 19 0x72 ch0 CPLD6 LED function of SFP28 & QSFP28 (Port1~26)
},
{
I2C_BOARD_INFO("optoe2", 0x50), // 20 0x50 SFP28 EEPROM
},
};
static struct platform_driver ix8_platform_driver = {
.driver = {
.name = "qci-ix8",
.owner = THIS_MODULE,
},
};
static struct platform_device *ix8_device;
static int __init ix8_platform_init(void)
{
struct i2c_client *client;
struct i2c_adapter *adapter;
int ret, i;
ret = platform_driver_register(&ix8_platform_driver);
if (ret < 0)
return ret;
/* Register platform stuff */
ix8_device = platform_device_alloc("qci-ix8", -1);
if (!ix8_device) {
ret = -ENOMEM;
goto fail_platform_driver;
}
ret = platform_device_add(ix8_device);
if (ret)
goto fail_platform_device;
adapter = i2c_get_adapter(0);
client = i2c_new_device(adapter, &ix8_i2c_devices[0]); // pca9546
client = i2c_new_device(adapter, &ix8_i2c_devices[1]); // pca9548
client = i2c_new_device(adapter, &ix8_i2c_devices[16]); // pca9546cpu
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x02);
client = i2c_new_device(adapter, &ix8_i2c_devices[17]); // CPU Board Data
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x10);
client = i2c_new_device(adapter, &ix8_i2c_devices[10]); // CPLD_1
client = i2c_new_device(adapter, &ix8_i2c_devices[18]); // CPLD_4
client = i2c_new_device(adapter, &ix8_i2c_devices[19]); // CPLD_6
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x11);
client = i2c_new_device(adapter, &ix8_i2c_devices[11]); // CPLD_2
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x12);
client = i2c_new_device(adapter, &ix8_i2c_devices[12]); // CPLD_3
client = i2c_new_device(adapter, &ix8_i2c_devices[2]); // MB_BOARDINFO_EEPROM
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x13);
client = i2c_new_device(adapter, &ix8_i2c_devices[13]); // MB Board Data
client = i2c_new_device(adapter, &ix8_i2c_devices[14]); // QSFP:49~52
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x14);
client = i2c_new_device(adapter, &ix8_i2c_devices[3]); // pca9548_1 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x15);
client = i2c_new_device(adapter, &ix8_i2c_devices[4]); // pca9548_2 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x16);
client = i2c_new_device(adapter, &ix8_i2c_devices[5]); // pca9548_3 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x17);
client = i2c_new_device(adapter, &ix8_i2c_devices[6]); // pca9548_4 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x18);
client = i2c_new_device(adapter, &ix8_i2c_devices[7]); // pca9548_5 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x19);
client = i2c_new_device(adapter, &ix8_i2c_devices[8]); // pca9548_6 SFP
i2c_put_adapter(adapter);
adapter = i2c_get_adapter(0x1a);
client = i2c_new_device(adapter, &ix8_i2c_devices[9]); // pca9548_7 QSFP
i2c_put_adapter(adapter);
for(i = 80; i < 88; i ++){ // QSFP 49~56 EEPROM
adapter = i2c_get_adapter(i);
client = i2c_new_device(adapter, &ix8_i2c_devices[15]);
i2c_put_adapter(adapter);
}
for(i = 32; i < 80; i ++){ // SFP28 1~48 EEPROM
adapter = i2c_get_adapter(i);
client = i2c_new_device(adapter, &ix8_i2c_devices[20]);
i2c_put_adapter(adapter);
}
return 0;
fail_platform_device:
platform_device_put(ix8_device);
fail_platform_driver:
platform_driver_unregister(&ix8_platform_driver);
return ret;
}
static void __exit ix8_platform_exit(void)
{
platform_device_unregister(ix8_device);
platform_driver_unregister(&ix8_platform_driver);
}
module_init(ix8_platform_init);
module_exit(ix8_platform_exit);
MODULE_AUTHOR("Jonathan Tsai <jonathan.tsai@quantatw.com>");
MODULE_VERSION("1.0");
MODULE_DESCRIPTION("Quanta IX8 Platform Driver");
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,13 @@
[Unit]
Description=Quanta IX8-56X Platform initialization service
Before=pmon.service
DefaultDependencies=no
[Service]
Type=oneshot
ExecStart=/usr/local/bin/quanta_ix8_util.py install
ExecStop=/usr/local/bin/quanta_ix8_util.py clean
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,16 @@
#!/usr/bin/env python
import os
import sys
from setuptools import setup
os.listdir
setup(
name='ix8_56x',
version='1.0',
description='Module to initialize Quanta IX8-56X platforms',
packages=['ix8_56x'],
package_dir={'ix8_56x': 'ix8-56x/classes'},
)

View File

@ -0,0 +1,329 @@
#!/usr/bin/env python
#
# Copyright (C) 2018 Quanta Computer Inc.
#
# 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/>.
"""
Usage: %(scriptName)s [options] command object
options:
-h | --help : this help message
-d | --debug : run with debug mode
-f | --force : ignore error during installation or clean
command:
install : install drivers and generate related sysfs nodes
clean : uninstall drivers and remove related sysfs nodes
"""
import os
import commands
import sys, getopt
import logging
import re
import time
from collections import namedtuple
DEBUG = False
args = []
FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
def main():
global DEBUG
global args
global FORCE
if len(sys.argv)<2:
show_help()
options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
'debug',
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
for opt, arg in options:
if opt in ('-h', '--help'):
show_help()
elif opt in ('-d', '--debug'):
DEBUG = True
logging.basicConfig(level=logging.INFO)
elif opt in ('-f', '--force'):
FORCE = 1
else:
logging.info('no option')
for arg in args:
if arg == 'install':
install()
elif arg == 'clean':
uninstall()
else:
show_help()
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX8-56X]"+txt
return
def exec_cmd(cmd, show):
logging.info('Run :'+cmd)
status, output = commands.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:"+output)
if status:
logging.info('Failed :'+cmd)
if show:
print('Failed :'+cmd)
return status, output
instantiate =[
#turn on module power
'echo 21 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio21/direction',
'echo 1 >/sys/class/gpio/gpio21/value',
#export pca9698 for qsfp present
'echo 34 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio34/direction',
'echo 38 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio38/direction',
'echo 42 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio42/direction',
'echo 46 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio46/direction',
'echo 50 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio50/direction',
'echo 54 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio54/direction',
'echo 58 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio58/direction',
'echo 62 > /sys/class/gpio/export',
'echo in > /sys/class/gpio/gpio62/direction',
#export pca9698 for qsfp reset
'echo 32 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio32/direction',
'echo 1 >/sys/class/gpio/gpio32/value',
'echo 36 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio36/direction',
'echo 1 >/sys/class/gpio/gpio36/value',
'echo 40 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio40/direction',
'echo 1 >/sys/class/gpio/gpio40/value',
'echo 44 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio44/direction',
'echo 1 >/sys/class/gpio/gpio44/value',
'echo 48 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio48/direction',
'echo 1 >/sys/class/gpio/gpio48/value',
'echo 52 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio52/direction',
'echo 1 >/sys/class/gpio/gpio52/value',
'echo 56 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio56/direction',
'echo 1 >/sys/class/gpio/gpio56/value',
'echo 60 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio60/direction',
'echo 1 >/sys/class/gpio/gpio60/value',
#export pca9698 for qsfp lpmode
'echo 35 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio35/direction',
'echo 0 >/sys/class/gpio/gpio35/value',
'echo 39 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio39/direction',
'echo 0 >/sys/class/gpio/gpio39/value',
'echo 43 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio43/direction',
'echo 0 >/sys/class/gpio/gpio43/value',
'echo 47 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio47/direction',
'echo 0 >/sys/class/gpio/gpio47/value',
'echo 51 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio51/direction',
'echo 0 >/sys/class/gpio/gpio51/value',
'echo 55 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio55/direction',
'echo 0 >/sys/class/gpio/gpio55/value',
'echo 59 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio59/direction',
'echo 0 >/sys/class/gpio/gpio59/value',
'echo 63 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio63/direction',
'echo 0 >/sys/class/gpio/gpio63/value',
#Reset fron-ports LED CPLD
'echo 73 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio73/direction',
'echo 0 >/sys/class/gpio/gpio73/value',
'echo 1 >/sys/class/gpio/gpio73/value',
#Enable front-ports LED decoding
'echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode',
'echo 1 > /sys/class/cpld-led/CPLDLED-2/led_decode',
#SFP28 Module TxEnable
'echo 0 > /sys/class/cpld-sfp28/port-1/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-2/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-3/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-4/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-5/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-6/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-7/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-8/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-9/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-10/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-11/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-12/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-13/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-14/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-15/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-16/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-17/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-18/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-19/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-20/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-21/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-22/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-23/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-24/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-25/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-26/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-27/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-28/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-29/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-30/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-31/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-32/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-33/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-34/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-35/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-36/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-37/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-38/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-39/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-40/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-41/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-42/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-43/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-44/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-45/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-46/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-47/tx_dis',
'echo 0 > /sys/class/cpld-sfp28/port-48/tx_dis',
#Update System LED
'echo 82 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio82/direction',
'echo 0 > /sys/class/gpio/gpio82/value',
'echo 83 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio83/direction',
'echo 1 > /sys/class/gpio/gpio83/value',
]
drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld_sfp28',
'qci_cpld_led',
'qci_platform_ix8',
'ipmi_devintf'
]
def system_install():
global FORCE
#remove default drivers to avoid modprobe order conflicts
status, output = exec_cmd("echo 'blacklist i2c-ismt' > /etc/modprobe.d/blacklist.conf", 1)
time.sleep(1)
status, output = exec_cmd("modprobe -r i2c-ismt ", 1)
status, output = exec_cmd("modprobe -r i2c-i801 ", 1)
#setup driver dependency
status, output = exec_cmd("depmod -a ", 1)
#install drivers
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe "+drivers[i], 1)
if status:
print output
if FORCE == 0:
return status
#instantiate devices
for i in range(0,len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
if FORCE == 0:
return status
#QSFP for 1~56 port
for port_number in range(1,57):
bus_number = port_number + 31
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
return
def system_ready():
if not device_found():
return False
return True
def install():
if not device_found():
print "No device, installing...."
status = system_install()
if status:
if FORCE == 0:
return status
else:
print " ix8 driver already installed...."
return
def uninstall():
global FORCE
#uninstall drivers
for i in range(len(drivers)-1,-1,-1):
status, output = exec_cmd("rmmod "+drivers[i], 1)
if status:
print output
if FORCE == 0:
return status
return
def device_found():
ret1, log = exec_cmd("ls "+i2c_prefix+"i2c-0", 0)
return ret1
if __name__ == "__main__":
main()