Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
'sonic_platform_base.sonic_eeprom',
'sonic_platform_base.sonic_sfp',
'sonic_platform_base.sonic_ssd',
'sonic_platform_base.sonic_pcie',
'sonic_psu',
'sonic_sfp',
],
Expand Down
Empty file.
43 changes: 43 additions & 0 deletions sonic_platform_base/sonic_pcie/pcie_base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env python
#
# pcie_base.py
#
# Abstract base class for implementing platform-specific
# PCIE functionality for SONiC
#

try:
import abc
except ImportError as e:
raise ImportError (str(e) + " - required module not found")

class PcieBase(object):
def __init__(self, path):
"""
Constructor

Args:
pcieutil file and config file path
"""

@abc.abstractmethod
def get_pcie_device(self):
"""
get current device pcie info

Returns:
A list including pcie device info
"""
return []


@abc.abstractmethod
def get_pcie_check(self):
"""
Check Pcie device with config file

Returns:
A list including pcie device and test result info
"""
return []

127 changes: 127 additions & 0 deletions sonic_platform_base/sonic_pcie/pcie_common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@

# pcieutil.py
# Platform-specific PCIE status interface for SONIC
#

import os
import yaml
import subprocess
import re
import sys
from copy import deepcopy
try:
from .pcie_base import PcieBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")



class PcieUtil(PcieBase):
"""Platform-specific PCIEutil class"""
# got the config file path
def __init__(self, path):
self.config_path = path

# load the config file
def load_config_file(self):
config_file = self.config_path + "/" + "pcie.yaml"
try:
with open(config_file) as conf_file:
self.confInfo = yaml.load(conf_file)
except IOError as e:
print "Error: {}".format(str(e))
print "Not found config file, please add a config file manually, or generate it by running [show platform pcieinfo -g]"
sys.exit()

# load current PCIe device
def get_pcie_device(self):
pciDict = {}
pciList = []
p1 = "^(\w+):(\w+)\.(\w)\s(.*)\s\(.*\)"
p2 = "^.*:.*:.*:(\w+)\s\(.*\)"
command1 = "sudo lspci"
command2 = "sudo lspci -n"
# run command 1
proc1 = subprocess.Popen(command1, shell=True, stdout=subprocess.PIPE)
output1 = proc1.stdout.readlines()
(out, err) = proc1.communicate()
# run command 2
proc2 = subprocess.Popen(command2, shell=True, stdout=subprocess.PIPE)
output2 = proc2.stdout.readlines()
(out, err) = proc2.communicate()

if proc1.returncode > 0:
for line1 in output1:
print(line1.strip())
return
elif proc2.returncode > 0:
for line2 in output2:
print(line2.strip())
return
else:
for (line1, line2) in zip(output1, output2):
pciDict.clear()
match1 = re.search(p1, line1.strip())
match2 = re.search(p2, line2.strip())
if match1 and match2:
Bus = match1.group(1)
Dev = match1.group(2)
Fn = match1.group(3)
Name = match1.group(4)
Id = match2.group(1)
pciDict["name"] = Name
pciDict["bus"] = Bus
pciDict["dev"] = Dev
pciDict["fn"] = Fn
pciDict["id"] = Id
pciList.append(pciDict)
pciDict = deepcopy(pciDict)
else:
print("CAN NOT MATCH PCIe DEVICE")
return pciList

# check the current PCIe device with config file and return the result
def get_pcie_check(self):
self.load_config_file()
infoList = []
infoDict = {}
err = 0
curInfo = self.get_pcie_device()
for item_conf in self.confInfo:
flag = 0
bus_conf = item_conf["bus"]
dev_conf = item_conf["dev"]
fn_conf = item_conf["fn"]
name_conf = item_conf["name"]
id_conf = item_conf["id"]
for item_cur in curInfo:
bus_cur = item_cur["bus"]
dev_cur = item_cur["dev"]
fn_cur = item_cur["fn"]
name_cur = item_cur["name"]
id_cur = item_cur["id"]
if bus_cur == bus_conf and dev_cur == dev_conf and \
fn_cur == fn_conf and name_cur == name_conf and \
id_cur == id_conf:
flag+=1
continue
if flag:
item_conf["result"] = "Passed"
else:
item_conf["result"] = "Failde"
err+=1
return self.confInfo

# generate the config file with current pci device
def dump_conf_yaml(self):
curInfo = self.get_pcie_device()
with open(self.config_path + "/" + "pcie.yaml", "w") as conf_file:
yaml.dump(curInfo, conf_file, default_flow_style=False)
print "generate pcie config file successfully ! ! !"
return






Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove these trailing empty lines