📄 pcidevs.c
字号:
#include "pmon.h"#include "stdio.h"#include "pcivar.h"#include "pcireg.h"#include "pcidevs.h"extern int _pciverbose;/* * Descriptions of known PCI classes and subclasses. * * Subclasses are described in the same way as classes, but have a * NULL subclass pointer. */struct pci_class { char *name; int val; /* as wide as pci_{,sub}class_t */ const struct pci_class *subclasses;};const struct pci_class pci_subclass_prehistoric[] = { { "miscellaneous", PCI_SUBCLASS_PREHISTORIC_MISC, }, { "VGA", PCI_SUBCLASS_PREHISTORIC_VGA, }, { 0 }};const struct pci_class pci_subclass_mass_storage[] = { { "SCSI", PCI_SUBCLASS_MASS_STORAGE_SCSI, }, { "IDE", PCI_SUBCLASS_MASS_STORAGE_IDE, }, { "floppy", PCI_SUBCLASS_MASS_STORAGE_FLOPPY, }, { "IPI", PCI_SUBCLASS_MASS_STORAGE_IPI, }, { "RAID", PCI_SUBCLASS_MASS_STORAGE_RAID, }, { "miscellaneous", PCI_SUBCLASS_MASS_STORAGE_MISC, }, { 0 },};const struct pci_class pci_subclass_network[] = { { "ethernet", PCI_SUBCLASS_NETWORK_ETHERNET, }, { "token ring", PCI_SUBCLASS_NETWORK_TOKENRING, }, { "FDDI", PCI_SUBCLASS_NETWORK_FDDI, }, { "ATM", PCI_SUBCLASS_NETWORK_ATM, }, { "miscellaneous", PCI_SUBCLASS_NETWORK_MISC, }, { 0 },};const struct pci_class pci_subclass_display[] = { { "VGA", PCI_SUBCLASS_DISPLAY_VGA, }, { "XGA", PCI_SUBCLASS_DISPLAY_XGA, }, { "miscellaneous", PCI_SUBCLASS_DISPLAY_MISC, }, { 0 },};const struct pci_class pci_subclass_multimedia[] = { { "video", PCI_SUBCLASS_MULTIMEDIA_VIDEO, }, { "audio", PCI_SUBCLASS_MULTIMEDIA_AUDIO, }, { "miscellaneous", PCI_SUBCLASS_MULTIMEDIA_MISC, }, { 0 },};const struct pci_class pci_subclass_memory[] = { { "RAM", PCI_SUBCLASS_MEMORY_RAM, }, { "flash", PCI_SUBCLASS_MEMORY_FLASH, }, { "miscellaneous", PCI_SUBCLASS_MEMORY_MISC, }, { 0 },};const struct pci_class pci_subclass_bridge[] = { { "host", PCI_SUBCLASS_BRIDGE_HOST, }, { "ISA", PCI_SUBCLASS_BRIDGE_ISA, }, { "EISA", PCI_SUBCLASS_BRIDGE_EISA, }, { "MicroChannel", PCI_SUBCLASS_BRIDGE_MC, }, { "PCI", PCI_SUBCLASS_BRIDGE_PCI, }, { "PCMCIA", PCI_SUBCLASS_BRIDGE_PCMCIA, }, { "NuBus", PCI_SUBCLASS_BRIDGE_NUBUS, }, { "CardBus", PCI_SUBCLASS_BRIDGE_CARDBUS, }, { "miscellaneous", PCI_SUBCLASS_BRIDGE_MISC, }, { 0 },};const struct pci_class pci_subclass_communication[] = { { "serial", PCI_SUBCLASS_COMMUNICATIONS_SERIAL, }, { "parallel", PCI_SUBCLASS_COMMUNICATIONS_PARALLEL, }, { "miscellaneous", PCI_SUBCLASS_COMMUNICATIONS_MISC, }, { 0 },};const struct pci_class pci_subclass_peripheral[] = { { "PIC", PCI_SUBCLASS_SYSTEM_PIC, }, { "DMA", PCI_SUBCLASS_SYSTEM_DMA, }, { "timer", PCI_SUBCLASS_SYSTEM_TIMER, }, { "RTC", PCI_SUBCLASS_SYSTEM_RTC, }, { "miscellaneous", PCI_SUBCLASS_SYSTEM_MISC, }, { 0 },};const struct pci_class pci_subclass_input[] = { { "keyboard", PCI_SUBCLASS_INPUT_KEYBOARD, }, { "digitiser", PCI_SUBCLASS_INPUT_DIGITIZER, }, { "mouse", PCI_SUBCLASS_INPUT_MOUSE, }, { "miscellaneous", PCI_SUBCLASS_INPUT_MISC, }, { 0 },};const struct pci_class pci_subclass_docking[] = { { "generic", PCI_SUBCLASS_DOCK_GENERIC, }, { "miscellaneous", PCI_SUBCLASS_DOCK_MISC, }, { 0 },};const struct pci_class pci_subclass_processor[] = { { "386", PCI_SUBCLASS_PROCESSOR_386, }, { "486", PCI_SUBCLASS_PROCESSOR_486, }, { "Pentium", PCI_SUBCLASS_PROCESSOR_PENTIUM, }, { "Alpha", PCI_SUBCLASS_PROCESSOR_ALPHA, }, { "PowerPC", PCI_SUBCLASS_PROCESSOR_POWERPC, }, { "coprocessor", PCI_SUBCLASS_PROCESSOR_COPROC, }, { 0 },};const struct pci_class pci_subclass_serialbus[] = { { "FireWire", PCI_SUBCLASS_SERIALBUS_FIREWIRE, }, { "Access", PCI_SUBCLASS_SERIALBUS_ACCESS, }, { "SSA", PCI_SUBCLASS_SERIALBUS_SSA, }, { "USB", PCI_SUBCLASS_SERIALBUS_USB, }, { "FibreChannel", PCI_SUBCLASS_SERIALBUS_FIBER, }, { 0 },};const struct pci_class pci_class[] = { { "prehistoric", PCI_CLASS_PREHISTORIC, pci_subclass_prehistoric, }, { "mass storage", PCI_CLASS_MASS_STORAGE, pci_subclass_mass_storage, }, { "network", PCI_CLASS_NETWORK, pci_subclass_network, }, { "display", PCI_CLASS_DISPLAY, pci_subclass_display, }, { "multimedia", PCI_CLASS_MULTIMEDIA, pci_subclass_multimedia, }, { "memory", PCI_CLASS_MEMORY, pci_subclass_memory, }, { "bridge", PCI_CLASS_BRIDGE, pci_subclass_bridge, }, { "communications", PCI_CLASS_COMMUNICATIONS, pci_subclass_communication, }, { "system", PCI_CLASS_SYSTEM, pci_subclass_peripheral, }, { "input", PCI_CLASS_INPUT, pci_subclass_input, }, { "docking", PCI_CLASS_DOCK, pci_subclass_docking, }, { "processor", PCI_CLASS_PROCESSOR, pci_subclass_processor, }, { "serialbus", PCI_CLASS_SERIALBUS, pci_subclass_serialbus, }, { "undefined", PCI_CLASS_UNDEFINED, 0, }, { 0 },};/* * Descriptions of of known vendors and devices ("products"). */struct pci_knowndev { pci_vendor_id_t vendor; pci_product_id_t product; int flags; char *vendorname, *productname;};#define PCI_KNOWNDEV_UNSUPP 0x01 /* unsupported device */#define PCI_KNOWNDEV_NOPROD 0x02 /* match on vendor only */#if !defined(NOPCINAMES)#include "pcidevs_data.h"#elsestatic const struct pci_knowndev pci_knowndevs[] = {{ 0, 0, 0, NULL, NULL, }};#endifvoid_pci_devinfo(pcireg_t id_reg, pcireg_t class_reg, int *supp, char *cp){ pci_vendor_id_t vendor; pci_product_id_t product; pci_class_t class; pci_subclass_t subclass; pci_interface_t interface; pci_revision_t revision; char *vendor_namep, *product_namep; const struct pci_class *classp; const struct pci_class *subclassp; const struct pci_knowndev *kdp; vendor = PCI_VENDOR(id_reg); product = PCI_PRODUCT(id_reg); class = PCI_CLASS(class_reg); subclass = PCI_SUBCLASS(class_reg); interface = PCI_INTERFACE(class_reg); revision = PCI_REVISION(class_reg); kdp = pci_knowndevs; while (kdp->vendorname != NULL) { /* all have vendor name */ if (kdp->vendor == vendor && (kdp->product == product || (kdp->flags & PCI_KNOWNDEV_NOPROD) != 0)) break; kdp++; } if (kdp->vendorname == NULL) { vendor_namep = product_namep = NULL; if (supp != NULL) *supp = 0; } else { vendor_namep = kdp->vendorname; product_namep = (kdp->flags & PCI_KNOWNDEV_NOPROD) == 0 ? kdp->productname : NULL; if (supp != NULL) *supp = (kdp->flags & PCI_KNOWNDEV_UNSUPP) == 0; } classp = pci_class; while (classp->name != NULL) { if (class == classp->val) break; classp++; } subclassp = (classp->name != NULL) ? classp->subclasses : NULL; while (subclassp && subclassp->name != NULL) { if (subclass == subclassp->val) break; subclassp++; } if (vendor_namep == NULL) cp += sprintf(cp, "vendor/product: 0x%04x/0x%04x", vendor, product); else if (product_namep != NULL) cp += sprintf(cp, "%s %s", vendor_namep, product_namep); else cp += sprintf(cp, "%s, product: 0x%x", vendor_namep, product); cp += sprintf(cp, " ("); if (classp->name == NULL) cp += sprintf(cp, "class/subclass: 0x%02x/0x%02x", class, subclass); else { cp += sprintf(cp, "%s, ", classp->name); if (subclassp == NULL || subclassp->name == NULL) cp += sprintf(cp, "subclass: 0x%02x", subclass); else cp += sprintf(cp, "%s", subclassp->name); } if (_pciverbose >= 2) { cp += sprintf(cp, ", interface: 0x%02x", interface); cp += sprintf(cp, ", revision: 0x%02x", revision); } cp+=sprintf(cp,")");/* strcpy (cp, ")");*/}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -