X-Git-Url: http://git.onelab.eu/?p=pypcilib.git;a=blobdiff_plain;f=pypci.py;h=1632bc5bd2a06482bdefef1c172d987086e5809d;hp=34124e1c04be243d59d04d622dd085477f619354;hb=dcd1c83597647b6b3e6893a340b91a02a50f7f77;hpb=8649b5e40e98d00afddcb5b903d46d2444fdba59 diff --git a/pypci.py b/pypci.py index 34124e1..1632bc5 100644 --- a/pypci.py +++ b/pypci.py @@ -1,56 +1,52 @@ import os -try: - from pypciscan import get_devices -except: - def get_devices(): - """ This is a replacement to the version in pypciscan library for 3.3 and lower bootcds - that will help maintain backward compatibility. This version has limitations wrt accuracy - that the library does not. In particular it is limited to the output of - lspci and 'forces' all devices to appear on the '0000' domain, rather than - where they actually are.""" - - ret = {} - pci_cmd = os.popen("""/sbin/lspci -nvm | sed -e 's/\t/ /g' -e 's/ Class //' -e 's/^/"/' -e 's/$/"/' -e 's/$/,/' -e 's/^"",$/],[/'""", 'r') - pci_str = "[" + pci_cmd.read() + "]" - pci_list = eval(pci_str) - - pci_devlist = [] - # convert each entry into a dict. and convert strings to ints. - for dev in pci_list: - rec = {} - for field in dev: - s = field.split(":") - if len(s) > 2: - # There are two 'device' fields in the output. Append - # 'addr' for the bus address, identified by the extra ':'. - end=":".join(s[1:]) - key = s[0].lower() + "addr" - value = end.strip() - else: - key = s[0].lower() - value = int(s[1].strip(), 16) - - rec[key] = value - - pci_devlist.append(rec) - - ret = {} - # convert this list of devices into the format expected by the - # consumer of get_devices() - for dev in pci_devlist: - if 'device' not in dev: - continue - - if 'sdevice' in dev: subdev = dev['sdevice'] - else: subdev = 0xffffffffL - - if 'svendor' in dev: subvend = dev['svendor'] - else: subvend = 0xffffffffL - - key = "0000:%s" % dev['deviceaddr'] - value = (dev['vendor'], dev['device'], subvend, subdev, dev['class'] << 8) - ret[key] = value - - return ret + +def get_devices(): + """ This is a replacement to the pypciscan library.""" + + ret = {} + pci_cmd = os.popen("""/sbin/lspci -Dnvm | sed -e 's/\t/ /g' -e 's/^/"/' -e 's/$/"/' -e 's/$/,/' -e 's/^"",$/],[/'""", 'r') + pci_str = "[" + pci_cmd.read() + "]" + pci_list = eval(pci_str) + + pci_devlist = [] + # convert each entry into a dict. and convert strings to ints. + for dev in pci_list: + rec = {} + for field in dev: + s = field.split(":") + if len(s) > 2: + # There are two 'device' fields in the output. Append + # 'addr' for the bus address, identified by the extra ':'. + end=":".join(s[1:]) + key = s[0].lower() + "addr" + value = end.strip() + else: + key = s[0].lower() + value = int(s[1].strip(), 16) + + rec[key] = value + + pci_devlist.append(rec) + + ret = {} + # convert this list of devices into the format expected by the + # consumer of get_devices() + for dev in pci_devlist: + if 'deviceaddr' not in dev: + continue + + if 'sdevice' in dev: subdev = dev['sdevice'] + else: subdev = 0xffffffffL + + if 'svendor' in dev: subvend = dev['svendor'] + else: subvend = 0xffffffffL + + if 'progif' in dev: progif = dev['progif'] + else: progif = 0 + + value = (dev['vendor'], dev['device'], subvend, subdev, dev['class'] << 8 | progif) + ret[dev['deviceaddr']] = value + + return ret import pypcimap