forked from zhenggen-xu/sonic-buildimage
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
update get_pcie_check() to use sysfs instead of lspci output (zhengge…
…n-xu#95) * Check the status using the sysfs pci enumeration point instead of lspci * indentation * review comments * change the file name in the description
- Loading branch information
1 parent
17292e4
commit d4eb804
Showing
1 changed file
with
106 additions
and
120 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,120 +1,106 @@ | ||
|
||
# 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 [pcieutil pcie_generate]" | ||
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"] = "Failed" | ||
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) | ||
return | ||
# pcie_common.py | ||
# Common PCIE check interfaces 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 [pcieutil pcie_generate]" | ||
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 sysfs tree for each PCIe device | ||
def check_pcie_sysfs(self, domain=0, bus=0, device=0, func=0): | ||
dev_path = os.path.join('/sys/bus/pci/devices', '%04x:%02x:%02x.%d' % (domain, bus, device, func)) | ||
if os.path.exists(dev_path): | ||
return True | ||
return False | ||
|
||
# check the current PCIe device with config file and return the result | ||
def get_pcie_check(self): | ||
self.load_config_file() | ||
for item_conf in self.confInfo: | ||
bus_conf = item_conf["bus"] | ||
dev_conf = item_conf["dev"] | ||
fn_conf = item_conf["fn"] | ||
if self.check_pcie_sysfs(bus=int(bus_conf, base=16), device=int(dev_conf, base=16), func=int(fn_conf, base=16)): | ||
item_conf["result"] = "Passed" | ||
else: | ||
item_conf["result"] = "Failed" | ||
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) | ||
return |