/usr/share/pyshared/udevdiscover/device/pci.py is in udev-discover 0.2.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 | # -*- coding: utf-8 -*-
# vim: ts=4
###
#
# Copyright (c) 2010 J. Félix Ontañón
#
# pci_class_names adapted from gnome-device-manager
# Copyright (C) 2007 David Zeuthen
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation
#
# 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/>.
#
# Authors : J. Félix Ontañón <fontanon@emergya.es>
#
import subprocess
import re
from udevdiscover.device import Device
from udevdiscover.utils import memoized
UNKNOWN_NAME = 'Unknown PCI Device'
PCI_DB_CMD = '/lib/udev/pci-db'
vendor_regex = re.compile('(?<=ID_VENDOR_FROM_DATABASE=).*')
model_regex = re.compile('(?<=ID_MODEL_FROM_DATABASE=).*')
pci_class_names = {
(0x01, -1, -1): (_('Storage Controller'), _('Mass Storage Controller')),
(0x01, 0x00, -1): (_('SCSI Controller'), _('SCSI Storage Controller')),
(0x01, 0x01, -1): (_('IDE Controller'), _('IDE Storage Controller')),
(0x01, 0x02, -1): (_('Floppy Controller'), _('Floppy Disk Storage Controller')),
(0x01, 0x03, -1): (_('IPI Controller'), _('IPI Bus Storage Controller')),
(0x01, 0x04, -1): (_('RAID Controller'), _('Raid Bus Storage Controller')),
(0x01, 0x05, -1): (_('ATA Controller'), _('ATA Storage Controller')),
(0x01, 0x06, -1): (_('SATA Controller'), _('SATA Storage Controller')),
(0x01, 0x06, 0x01): (_('AHCI Controller'), _('SATA ACHI 1.0 Storage Controller')),
(0x01, 0x07, -1): (_('Serial SCSI Controller'), _('Serial SCSI Storage Controller')),
(0x02, -1, -1): (_('Network Controller'), _('Network Controller')),
(0x02, 0x00, -1): (_('Ethernet Controller'), _('Ethernet Network Controller')),
(0x02, 0x01, -1): (_('Token Ring Controller'), _('Token Ring Network Controller')),
(0x02, 0x02, -1): (_('FDDI Controller'), _('FDDI Network Controller')),
(0x02, 0x03, -1): (_('ATM Controller'), _('ATM Network Controller')),
(0x02, 0x03, -1): (_('ISDN Controller'), _('ISDN Network Controller')),
(0x03, -1, -1): (_('Display Controller'), _('Display Controller')),
(0x03, 0x00, -1): (_('VGA Controller'), _('VGA Controller')),
(0x03, 0x01, -1): (_('XGA Controller'), _('XGA Controller')),
(0x03, 0x02, -1): (_('3D Controller'), _('3D Controller')),
(0x04, -1, -1): (_('Multimedia Controller'), _('Multimedia Controller')),
(0x04, 0x00, -1): (_('Video Controller'), _('Video Controller')),
(0x04, 0x01, -1): (_('Audio Controller'), _('Audio Controller')),
(0x04, 0x02, -1): (_('Telephony Controller'), _('Telephony Controller')),
(0x04, 0x03, -1): (_('Audio Device'), _('Audio Device')),
(0x05, -1, -1): (_('Memory Controller'), _('Memory Controller')),
(0x05, 0x00, -1): (_('RAM Controller'), _('RAM Memory Controller')),
(0x05, 0x01, -1): (_('FLASH Controller'), _('FLASH Memory Controller')),
(0x06, -1, -1): (_('Bridge'), _('Bridge')),
(0x06, 0x00, -1): (_('Host Bridge'), _('Host Bridge')),
(0x06, 0x01, -1): (_('ISA Bridge'), _('ISA Bridge')),
(0x06, 0x02, -1): (_('EISA Bridge'), _('EISA Bridge')),
(0x06, 0x03, -1): (_('MicroChannel Bridge'), _('MicroChannel Bridge')),
(0x06, 0x04, -1): (_('PCI Bridge'), _('PCI Bridge')),
(0x06, 0x04, 0x00): (_('PCI Bridge'), _('PCI Bridge (Normal decode)')),
(0x06, 0x04, 0x01): (_('PCI Bridge'), _('PCI Bridge (Subtractive decode)')),
(0x06, 0x05, -1): (_('PCMCIA Bridge'), _('PCMCIA Bridge')),
(0x06, 0x06, -1): (_('NuBus Bridge'), _('NuBus Bridge')),
(0x06, 0x07, -1): (_('CardBus Bridge'), _('CardBus Bridge')),
(0x06, 0x08, -1): (_('RACEway Bridge'), _('RACEway Bridge')),
(0x06, 0x09, -1): (_('Semitrans. PCI-to-PCI Bridge'), _('Semitransparent PCI-to-PCI Bridge')),
(0x06, 0x0a, -1): (_('InfiniBand to PCI Host Bridge'), _('InfiniBand to PCI Host Bridge')),
(0x07, -1, -1): (_('Communications Controller'), _('Communications Controller')),
(0x07, 0x00, -1): (_('Serial Controller'), _('Serial Controller')),
(0x07, 0x00, 0x00): (_('8250 Serial Controller'), _('8540 Serial Controller')),
(0x07, 0x00, 0x00): (_('16450 Serial Controller'), _('16450 Serial Controller')),
(0x07, 0x00, 0x00): (_('16550 Serial Controller'), _('16550 Serial Controller')),
(0x07, 0x00, 0x00): (_('16650 Serial Controller'), _('16650 Serial Controller')),
(0x07, 0x00, 0x00): (_('16750 Serial Controller'), _('16750 Serial Controller')),
(0x07, 0x00, 0x00): (_('16850 Serial Controller'), _('16850 Serial Controller')),
(0x07, 0x00, 0x00): (_('16950 Serial Controller'), _('16950 Serial Controller')),
(0x07, 0x01, -1): (_('Parallel Controller'), _('Parallel Controller')),
(0x07, 0x01, 0x00): (_('SPP Parallel Controller'), _('SPP Parallel Controller')),
(0x07, 0x01, 0x01): (_('Bidir Parallel Controller'), _('Bidirectional Parallel Controller')),
(0x07, 0x01, 0x02): (_('ECP Parallel Controller'), _('ECP Parallel Controller')),
(0x07, 0x01, 0x03): (_('IEEE 1284 Parallel Controller'), _('IEEE 1284 Parallel Controller')),
(0x07, 0x01, 0xfe): (_('IEEE 1284 Target Parallel Controller'), _('IEEE 1284 Target Parallel Controller')),
(0x07, 0x02, -1): (_('Multiport Serial Controller'), _('Multiport Serial Controller')),
(0x07, 0x03, -1): (_('Modem'), _('Modem')),
(0x07, 0x03, 0x00): (_('Generic Modem'), _('Generic Modem')),
(0x07, 0x03, 0x01): (_('Hayes/16450 Modem'), _('Hayes/16450 Compatiable Modem')),
(0x07, 0x03, 0x02): (_('Hayes/16550 Modem'), _('Hayes/16550 Compatiable Modem')),
(0x07, 0x03, 0x03): (_('Hayes/16650 Modem'), _('Hayes/16650 Compatiable Modem')),
(0x07, 0x03, 0x04): (_('Hayes/16750 Modem'), _('Hayes/16750 Compatiable Modem')),
(0x08, -1, -1): (_('System Peripheral'), _('Generic System Peripheral')),
(0x08, 0x00, -1): (_('PIC'), _('PIC System Peripheral')),
(0x08, 0x00, 0x00): (_('8259 PIC'), _('8259 PIC System Peripheral')),
(0x08, 0x00, 0x01): (_('ISA PIC'), _('ISA PIC System Peripheral')),
(0x08, 0x00, 0x02): (_('EISA PIC'), _('EISA PIC System Peripheral')),
(0x08, 0x00, 0x10): (_('IO-APIC'), _('IO-APIC System Peripheral')),
(0x08, 0x00, 0x20): (_('IO(X)-APIC'), _('IO(X)-APIC System Peripheral')),
(0x08, 0x01, -1): (_('DMA Controller'), _('DMA Controller')),
(0x08, 0x01, 0x00): (_('8237 DMA Controller'), _('DMA Controller')),
(0x08, 0x01, 0x01): (_('ISA DMA Controller'), _('ISA DMA Controller')),
(0x08, 0x01, 0x02): (_('EISA DMA Controller'), _('EISA DMA Controller')),
(0x08, 0x02, -1): (_('Timer Controller'), _('Timer Controller')),
(0x08, 0x02, 0x00): (_('8254 Timer Controller'), _('8254 Timer Controller')),
(0x08, 0x02, 0x01): (_('ISA Timer Controller'), _('ISA Timer Controller')),
(0x08, 0x02, 0x02): (_('EISA Timer Controller'), _('EISA Timer Controller')),
(0x08, 0x03, -1): (_('Real-Time Clock'), _('Real-Time Clock')),
(0x08, 0x03, 0x00): (_('Generic Real-Time Clock'), _('Generic Real-Time Clock')),
(0x08, 0x03, 0x01): (_('ISA Real-Time Clock'), _('ISA Real-Time Clock')),
(0x08, 0x04, -1): (_('PCI Hot-plug Controller'), _('PCI Hot-plug Controller')),
(0x09, -1, -1): (_('Input Controller'), _('Input Device Controller')),
(0x09, 0x00, -1): (_('Keyboard Controller'), _('Keyboard Controller')),
(0x09, 0x01, -1): (_('Digitizer Pen Controller'), _('Digitizer Pen Controller')),
(0x09, 0x02, -1): (_('Mouse Controller'), _('Mouse Controller')),
(0x09, 0x03, -1): (_('Scanner Controller'), _('Scanner Controller')),
(0x09, 0x04, -1): (_('Gameport Controller'), _('Gameport Controller')),
(0x09, 0x04, 0x00): (_('Gameport Controller'), _('Generic Gameport Controller')),
(0x09, 0x04, 0x10): (_('Gameport Controller'), _('Extended Gameport Controller')),
(0x0a, -1, -1): (_('Docking Station'), _('Docking Station')),
(0x0a, 0x00, -1): (_('Docking Station'), _('Generic Docking Station')),
(0x0b, -1, -1): (_('Processor'), _('Processor')),
(0x0b, 0x00, -1): (_('386 Processor'), _('386 Processor')),
(0x0b, 0x01, -1): (_('486 Processor'), _('486 Processor')),
(0x0b, 0x02, -1): (_('Pentium Processor'), _('Pentium Processor')),
(0x0b, 0x10, -1): (_('Alpha Processor'), _('Alpha Processor')),
(0x0b, 0x20, -1): (_('Power PC Processor'), _('Power PC Processor')),
(0x0b, 0x30, -1): (_('MIPS Processor'), _('MIPS Processor')),
(0x0b, 0x40, -1): (_('Co-processor'), _('Co-processor')),
(0x0c, -1, -1): (_('Serial Bus Controller'), _('Serial Bus Controller')),
(0x0c, 0x00, -1): (_('IEEE 1394 Controller'), _('IEEE 1394 Controller')),
(0x0c, 0x00, 0x10): (_('IEEE 1394 OHCI Controller'), _('IEEE 1394 OHCI Controller')),
(0x0c, 0x01, -1): (_('ACCESS Bus Controller'), _('ACCESS Bus Controller')),
(0x0c, 0x02, -1): (_('SSA Controller'), _('SSA Controller')),
(0x0c, 0x03, -1): (_('USB Controller'), _('USB Controller')),
(0x0c, 0x03, 0x00): (_('USB UHCI Controller'), _('USB UHCI Controller')),
(0x0c, 0x03, 0x10): (_('USB OHCI Controller'), _('USB OHCI Controller')),
(0x0c, 0x03, 0x20): (_('USB EHCI Controller'), _('USB EHCI Controller')),
(0x0c, 0x04, -1): (_('Fibre Channel Controller'), _('Fibre Channel Controller')),
(0x0c, 0x05, -1): (_('SMBus Controller'), _('SMBus Controller')),
(0x0c, 0x06, -1): (_('InfiniBand Controller'), _('InfiniBand Controller')),
(0x0d, -1, -1): (_('Wireless Controller'), _('Wireless Controller')),
(0x0d, 0x00, -1): (_('IRDA Controller'), _('IRDA Wireless Controller')),
(0x0d, 0x01, -1): (_('Consumer IR Controller'), _('Consumer IR Wireless Controller')),
(0x0d, 0x10, -1): (_('RF Controller'), _('RF Wireless Controller')),
(0x0e, -1, -1): (_('Intelligent Controller'), _('Intelligent Controller')),
(0x0e, -1, -1): (_('I20 Controller'), _('I20 Intelligent Controller')),
(0x0f, -1, -1): (_('Satellite Comm. Controller'), _('Satellite Communications Controller')),
(0x0f, 0x00, -1): (_('Satellite TV Controller'), _('Satellite TV Communications Controller')),
(0x0f, 0x01, -1): (_('Satellite Audio Controller'), _('Satellite Audio Communications Controller')),
(0x0f, 0x03, -1): (_('Satellite Voice Controller'), _('Satellite Voice Communications Controller')),
(0x0f, 0x04, -1): (_('Satellite Data Controller'), _('Satellite Data Communications Controller')),
(0x10, -1, -1): (_('Encryption Controller'), _('Encryption Controller')),
(0x10, 0x00, -1): (_('Network Encryption Device'), _('Network and Computing Encryption Device')),
(0x11, -1, -1): (_('Signal Processing Controller'), _('Signal Processing Controller')),
(0x11, 0x00, -1): (_('DPIO Module'), _('DPIO Module Signal Processing Controller')),
(0x11, 0x01, -1): (_('Performance Counters'), _('Performance Counters'))
}
def get_device_object(device):
return PCIDevice(device)
@memoized
def get_pci_short_long_names(pci_class, pci_subclass, pci_protocol):
key = [pci_class]
klasses = [k for k in pci_class_names.keys() if k[0] == pci_class]
if not klasses:
return UNKNOWN_NAME, UNKNOWN_NAME
subklasses = [s for s in klasses if s[1] == pci_subclass]
if not subklasses:
key.append(-1)
else:
key.append(pci_subclass)
if not (key[0], key[1], pci_protocol) in klasses:
key.append(-1)
else:
key.append(pci_protocol)
if pci_class_names.has_key(tuple(key)):
return pci_class_names[tuple(key)]
else:
return pci_class_names[(pci_class, -1, -1)]
@memoized
def get_pci_vendor_model_names(sysfs_path):
vendor_name, model_name = None, None
process = subprocess.Popen([PCI_DB_CMD, sysfs_path], stdout=subprocess.PIPE)
if process.wait() == 0:
output = process.communicate()[0]
vendor_res = vendor_regex.search(output)
model_res = model_regex.search(output)
if vendor_res: vendor_name = vendor_res.group(0)
if model_res: model_name = model_res.group(0)
return vendor_name, model_name
class PCIDevice(Device):
DEFAULT_ICON = 'udev-discover-device-pci'
def __get_class_subclass_protocol(self, pci_id):
pci_protocol = int(pci_id[-2:], 16)
pci_subclass = int(pci_id[-4:-2], 16)
pci_class = int(pci_id[:-4], 16)
return pci_class, pci_subclass, pci_protocol
@property
def nice_label(self):
if not 'PCI_CLASS' in self.device.get_property_keys():
return self.device.get_name() or UNKNOWN_DEV
#FIXME: Check len(PCI_CLASS) = 5 | 6 first
pci_class, pci_subclass, pci_protocol = \
self.__get_class_subclass_protocol(str(self.device.get_property('PCI_CLASS')))
short_name, long_name = get_pci_short_long_names(pci_class,
pci_subclass, pci_protocol)
return short_name
@property
def vendor_name(self):
return get_pci_vendor_model_names(self.path.split('/sys')[1])[0]
@property
def model_name(self):
return get_pci_vendor_model_names(self.path.split('/sys')[1])[1]
|