Skip to content

Commit 4eb3568

Browse files
akokhanlguohan
authored andcommitted
[platform]: fixed syseeprom access for BFN platform (sonic-net#3216)
Signed-off-by: Andriy Kokhan <akokhan@barefootnetworks.com>
1 parent 7b0786e commit 4eb3568

7 files changed

Lines changed: 4135 additions & 1 deletion

File tree

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#!/usr/bin/python
2+
3+
4+
try:
5+
import importlib
6+
import time
7+
import os
8+
import re
9+
import sys
10+
import errno
11+
import datetime
12+
13+
sys.path.append(os.path.dirname(__file__))
14+
import pltfm_mgr_rpc
15+
from pltfm_mgr_rpc.ttypes import *
16+
17+
from thrift.transport import TSocket
18+
from thrift.transport import TTransport
19+
from thrift.protocol import TBinaryProtocol
20+
from thrift.protocol import TMultiplexedProtocol
21+
22+
from argparse import ArgumentParser
23+
from cStringIO import StringIO
24+
from sonic_eeprom import eeprom_base
25+
from sonic_eeprom import eeprom_tlvinfo
26+
except ImportError, e:
27+
raise ImportError (str(e) + "- required module not found")
28+
29+
30+
eeprom_default_dict = {
31+
"prod_name" : ("Product Name", "0x21", 12),
32+
"odm_pcba_part_num" : ("Part Number", "0x22", 13),
33+
"prod_ser_num" : ("Serial Number", "0x23", 12),
34+
"ext_mac_addr" : ("Extended MAC Address Base", "0x24", 12),
35+
"sys_mfg_date" : ("System Manufacturing Date", "0x25", 4),
36+
"prod_ver" : ("Product Version", "0x26", 1),
37+
"ext_mac_addr_size" : ("Extende MAC Address Size", "0x2A", 2),
38+
"sys_mfger" : ("Manufacturer", "0x2B", 8)
39+
}
40+
41+
eeprom_dict = { "version" : ("Version", None, 0),
42+
"pcb_mfger" : ("PCB Manufacturer", "0x01", 8),
43+
"prod_ser_num" : ("Serial Number", "0x23", 12),
44+
"bfn_pcba_part_num" : ("Switch PCBA Part Number", "0x02", 12),
45+
"odm_pcba_part_num" : ("Part Number", "0x22", 13),
46+
"bfn_pcbb_part_num" : ("Switch PCBB Part Number", "0x04", 12),
47+
"sys_asm_part_num" : ("System Assembly Part Number", "0x05", 12),
48+
"prod_state" : ("Product Production State", "0x06", 1),
49+
"location" : ("EEPROM Location of Fabric", "0x07", 8),
50+
"ext_mac_addr_size" : ("Extende MAC Address Size", "0x08", 2),
51+
"sys_mfg_date" : ("System Manufacturing Date", "0x25", 4),
52+
"prod_name" : ("Product Name", "0x21", 12),
53+
"prod_ver" : ("Product Version", "0x26", 1),
54+
"prod_part_num" : ("Product Part Number", "0x09", 8),
55+
"sys_mfger" : ("Manufacturer", "0x2B", 8),
56+
"assembled_at" : ("Assembled at", "0x08", 8),
57+
"prod_ast_tag" : ("Product Asset Tag", "0x09", 12),
58+
"loc_mac_addr" : ("Local MAC address", "0x0A", 12),
59+
"odm_pcba_ser_num" : ("ODM PBCA Serial Number", "0x0B", 12),
60+
"ext_mac_addr" : ("Extended MAC Address Base", "0x0C", 12),
61+
"prod_sub_ver" : ("Product Sub Version", "0x0D", 1)
62+
}
63+
64+
product_dict = { "Montara" : "Wedge100BF-32X-O-AC-F-BF",
65+
"Lower MAV" : "Wedge100BF-65X-O-AC-F-BF",
66+
"Upper MAV" : "Wedge100BF-65X-O-AC-F-BF"
67+
}
68+
69+
thrift_server = 'localhost'
70+
transport = None
71+
pltfm_mgr = None
72+
73+
EEPROM_SYMLINK = "/var/run/platform/eeprom/syseeprom"
74+
75+
76+
class board(eeprom_tlvinfo.TlvInfoDecoder):
77+
78+
def __init__(self, name, path, cpld_root, ro):
79+
80+
if not os.path.exists(os.path.dirname(EEPROM_SYMLINK)):
81+
try:
82+
os.makedirs(os.path.dirname(EEPROM_SYMLINK))
83+
except OSError as e:
84+
if e.errno != errno.EEXIST:
85+
raise
86+
87+
open(EEPROM_SYMLINK, 'a').close()
88+
89+
self.eeprom_path = EEPROM_SYMLINK
90+
super(board, self).__init__(self.eeprom_path, 0, '', True)
91+
self.eeprom_init()
92+
93+
def thrift_setup(self):
94+
global thrift_server, transport, pltfm_mgr
95+
transport = TSocket.TSocket(thrift_server, 9090)
96+
97+
transport = TTransport.TBufferedTransport(transport)
98+
bprotocol = TBinaryProtocol.TBinaryProtocol(transport)
99+
100+
pltfm_mgr_client_module = importlib.import_module(".".join(["pltfm_mgr_rpc", "pltfm_mgr_rpc"]))
101+
pltfm_mgr_protocol = TMultiplexedProtocol.TMultiplexedProtocol(bprotocol, "pltfm_mgr_rpc")
102+
pltfm_mgr = pltfm_mgr_client_module.Client(pltfm_mgr_protocol)
103+
104+
transport.open()
105+
106+
def thrift_teardown(self):
107+
global transport
108+
transport.close()
109+
110+
def eeprom_init(self):
111+
global pltfm_mgr
112+
self.thrift_setup()
113+
eeprom = pltfm_mgr.pltfm_mgr_sys_eeprom_get()
114+
self.thrift_teardown()
115+
116+
eeprom_params = ""
117+
for attr, val in eeprom.__dict__.iteritems():
118+
if val is None:
119+
continue
120+
121+
elem = eeprom_default_dict.get(attr)
122+
if elem is None:
123+
continue
124+
125+
if isinstance(val, basestring):
126+
value = val.replace('\0', '')
127+
else:
128+
value = str(val)
129+
130+
if attr == "sys_mfg_date":
131+
value = datetime.datetime.strptime(value, '%m-%d-%y').strftime('%m/%d/%Y 00:00:00')
132+
133+
product = product_dict.get(value)
134+
if product is not None:
135+
value = product
136+
if len(eeprom_params) > 0:
137+
eeprom_params += ","
138+
eeprom_params += "{0:s}={1:s}".format(elem[1], value)
139+
140+
orig_stdout = sys.stdout
141+
sys.stdout = StringIO()
142+
new_e = eeprom_tlvinfo.TlvInfoDecoder.set_eeprom(self, "", [eeprom_params])
143+
sys.stdout = orig_stdout
144+
eeprom_base.EepromDecoder.write_eeprom(self, new_e)
145+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__all__ = ['ttypes', 'constants', 'pltfm_mgr_rpc']

0 commit comments

Comments
 (0)