From f5826164936359560ef5b88b97fc953065eb7794 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Fri, 10 Mar 2023 23:17:33 +0100 Subject: pci_info: get_ vendor/class/subclass/progif _str --- kernel/src/devices/pci_info.c | 410 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 410 insertions(+) create mode 100644 kernel/src/devices/pci_info.c (limited to 'kernel/src/devices/pci_info.c') diff --git a/kernel/src/devices/pci_info.c b/kernel/src/devices/pci_info.c new file mode 100644 index 0000000..a5345f9 --- /dev/null +++ b/kernel/src/devices/pci_info.c @@ -0,0 +1,410 @@ +#include +#include +#include +#include + +const char *get_vendor(uint64_t vendor_id) +{ + switch (vendor_id) { + case 0x8086: + return "Intel"; + case 0x1022: + return "AMD"; + default: + return NULL; + } +} + +const char *get_class(uint64_t class_code) +{ + switch (class_code) { + case 0x0: + return "Unclassified"; + case 0x1: + return "Mass Storage Controller"; + case 0x2: + return "Network Controller"; + case 0x3: + return "Display Controller"; + case 0x4: + return "Multimedia Controller"; + case 0x5: + return "Memory Controller"; + case 0x6: + return "Bridge"; + case 0x7: + return "Simple Communication Controller"; + case 0x8: + return "Base System Peripheral"; + case 0x9: + return "Input Device Controller"; + case 0xa: + return "Docking Station"; + case 0xb: + return "Processor"; + case 0xc: + return "Serial Bus Controller"; + case 0xd: + return "Wireless Controller"; + case 0xe: + return "Intelligent Controller"; + case 0xf: + return "Satellite Communication Controller"; + case 0x10: + return "Encryption Controller"; + case 0x11: + return "Signal Processing Controller"; + case 0x12: + return "Processing Accelerator"; + case 0x13: + return "Non-Essential Instrumentation"; + case 0x14: + return "0x3F (Reserved)"; + case 0x40: + return "Co-Processor"; + case 0x41: + return "0xFE (Reserved)"; + case 0xFF: + return "Unassigned Class (Vendor specific)"; + } + return "Unknown"; +} + +const char *get_subclass(uint64_t class_code, uint64_t subclass) +{ + switch (class_code) { + case 0x0: + switch (subclass) { + case 0x0: + return "Non-VGA-Compatible"; + case 0x1: + return "VGA-Compatible"; + } + break; + case 0x1: + switch (subclass) { + case 0x0: + return "SCSI Bus Controller"; + case 0x1: + return "IDE Controller"; + case 0x2: + return "IPI Bus Controller"; + case 0x3: + return "IPI Bus Controller"; + case 0x4: + return "RAID Controller"; + case 0x5: + return "ATA Controller"; + case 0x6: + return "Serial ATA Controller"; + case 0x7: + return "Serial Attached SCSI Controller"; + case 0x8: + return "Non-Volatile Memory Controller"; + case 0x80: + return "Other"; + } + break; + case 0x2: + switch (subclass) { + case 0x0: + return "Ethernet Controller"; + case 0x1: + return "Token Ring Controller"; + case 0x2: + return "FDDI Controller"; + case 0x3: + return "ATM Controller"; + case 0x4: + return "ISDN Controller"; + case 0x5: + return "WorldFip Controller"; + case 0x6: + return "PICMG 2.14 Multi Computing Controller"; + case 0x7: + return "Infiniband Controller"; + case 0x8: + return "Fabric Controller"; + case 0x80: + return "Other"; + } + break; + case 0x3: + switch (subclass) { + case 0x0: + return "VGA Compatible Controller"; + case 0x1: + return "XGA Controller"; + case 0x2: + return "3D Controller (Not VGA-Compatible)"; + case 0x80: + return "Other"; + } + break; + case 0x4: + switch (subclass) { + case 0x0: + return "Multimedia Video Controller"; + case 0x1: + return "Multimedia Audio Controller"; + case 0x2: + return "Computer Telephony Device"; + case 0x3: + return "Audio Device"; + case 0x80: + return "Other"; + } + break; + case 0x5: + switch (subclass) { + case 0x0: + return "RAM Controller"; + case 0x1: + return "Flash Controller"; + case 0x80: + return "Other"; + } + break; + case 0x6: + switch (subclass) { + case 0x0: + return "Host Bridge"; + case 0x1: + return "ISA Bridge"; + case 0x2: + return "EISA Bridge"; + case 0x3: + return "MCA Bridge"; + case 0x4: + return "PCI-to-PCI Bridge"; + case 0x5: + return "PCMCIA Bridge"; + case 0x6: + return "NuBus Bridge"; + case 0x7: + return "CardBus Bridge"; + case 0x8: + return "RACEway Bridge"; + case 0x9: + return "PCI-to-PCI Bridge"; + case 0xa: + return "InfiniBand-to-PCI Host Bridge"; + case 0x80: + return "Other"; + } + break; + case 0x7: + switch (subclass) { + case 0x0: + return "Serial Controller"; + case 0x1: + return "Parallel Controller"; + case 0x2: + return "Multiport Serial Controller"; + case 0x3: + return "Modem"; + case 0x4: + return "IEEE 488.1/2 (GPIB) Controller"; + case 0x5: + return "Smart Card Controller"; + case 0x80: + return "Other"; + } + break; + case 0x8: + switch (subclass) { + case 0x0: + return "PIC"; + case 0x1: + return "DMA Controller"; + case 0x2: + return "Timer"; + case 0x3: + return "RTC Controller"; + case 0x4: + return "PCI Hot-Plug Controller"; + case 0x5: + return "SD Host controller"; + case 0x6: + return "IOMMU"; + case 0x80: + return "Other"; + } + break; + case 0x9: + switch (subclass) { + case 0x0: + return "Keyboard Controller"; + case 0x1: + return "Digitizer Pen"; + case 0x2: + return "Mouse Controller"; + case 0x3: + return "Scanner Controller"; + case 0x4: + return "Gameport Controller"; + case 0x80: + return "Other"; + } + break; + case 0xa: + switch (subclass) { + case 0x0: + return "Generic"; + case 0x80: + return "Other"; + } + break; + case 0xb: + switch (subclass) { + case 0x0: + return "386"; + case 0x1: + return "486"; + case 0x2: + return "Pentium"; + case 0x3: + return "Pentium Pro"; + case 0x10: + return "Alpha"; + case 0x20: + return "PowerPC"; + case 0x30: + return "MIPS"; + case 0x40: + return "Co-Processor"; + case 0x80: + return "Other"; + } + break; + case 0xc: + switch (subclass) { + case 0x0: + return "FireWire (IEEE 1394) Controller"; + case 0x1: + return "ACCESS Bus Controller "; + case 0x2: + return "SSA"; + case 0x3: + return "USB Controller"; + case 0x4: + return "Fibre Channel"; + case 0x5: + return "SMBus Controller"; + case 0x6: + return "InfiniBand Controller"; + case 0x7: + return "IPMI Interface"; + case 0x8: + return "SERCOS Interface (IEC 61491)"; + case 0x9: + return "CANbus Controller"; + case 0x80: + return "Other"; + } + break; + case 0xd: + switch (subclass) { + case 0x0: + return "iRDA Compatible Controller"; + case 0x1: + return "Consumer IR Controller"; + case 0x10: + return "RF Controller"; + case 0x11: + return "Bluetooth Controller"; + case 0x12: + return "Broadband Controller"; + case 0x20: + return "Ethernet Controller (802.1a)"; + case 0x21: + return "Ethernet Controller (802.1b) "; + case 0x80: + return "Other"; + } + break; + case 0xe: + switch (subclass) { + case 0x0: + return "I20"; + } + break; + case 0xf: + switch (subclass) { + case 0x1: + return "Satellite TV Controller"; + case 0x2: + return "Satellite Audio Controller"; + case 0x3: + return "Satellite Voice Controller"; + case 0x4: + return "Satellite Data Controller"; + } + break; + case 0x10: + switch (subclass) { + case 0x0: + return "Network and Computing Encrpytion/Decryption"; + case 0x10: + return "Entertainment Encryption/Decryption"; + case 0x80: + return "Other"; + } + break; + case 0x11: + switch (subclass) { + case 0x0: + return "DPIO Modules"; + case 0x1: + return "Performance Counters"; + case 0x10: + return "Communication Synchronizer"; + case 0x20: + return "Signal Processing Management"; + case 0x80: + return "Other"; + } + break; + } + return NULL; +} + +const char *get_progif(uint64_t class_code, uint64_t subclass, uint64_t progif) +{ + switch (class_code) { + case 0x1: + switch (subclass) { + case 0x6: + switch (progif) { + case 0x0: + return "Vendor Specific Interface"; + case 0x1: + return "AHCI 1.0"; + case 0x2: + return "Serial Storage Bus"; + } + } + break; + case 0xc: + switch (subclass) { + case 0x3: + switch (progif) { + case 0x0: + return "UHCI Controller"; + case 0x10: + return "OHCI Controller"; + case 0x20: + return "EHCI (USB2) Controller"; + case 0x30: + return "XHCI (USB3) Controller"; + case 0x80: + return "Unspecified"; + case 0xFE: + return "USB Device"; + } + } + break; + } + + return NULL; +} -- cgit v1.2.3