18#include <IndustryStandard/Pci.h>
20#include <Protocol/PciIo.h>
22#include <Library/BaseLib.h>
23#include <Library/BaseMemoryLib.h>
24#include <Library/DebugLib.h>
25#include <Library/DevicePathLib.h>
26#include <Library/IoLib.h>
27#include <Library/MemoryAllocationLib.h>
29#include <Library/PrintLib.h>
30#include <Library/UefiBootServicesTableLib.h>
53 "VGA-compatible device",
76 "SCSI storage device SOP using PQI",
81 "SCSI controller SOP using PQI",
86 "SCSI storage device and controller SOP using PQI",
91 "SCSI storage device SOP using NVMe",
105 "ATA controller with single stepping ADMA interface",
110 "ATA controller with continous ADMA interface",
124 "Serial ATA controller",
129 "Serial ATA controller using AHCI",
134 "Serial Storage Bus interface",
148 "Non-volatile memory subsystem",
153 "Non-volatile memory subsystem using NVMHCI",
158 "NVM Express I/O controller",
163 "NVM Express administrative controller",
177 "Universal Flash Storage controller",
182 "Universal Flash Storage controller using UFSHCI",
194 PCI_CLASS_MASS_STORAGE_SCSI,
199 PCI_CLASS_MASS_STORAGE_IDE,
204 PCI_CLASS_MASS_STORAGE_FLOPPY,
209 PCI_CLASS_MASS_STORAGE_IPI,
210 "IPI bus controller",
214 PCI_CLASS_MASS_STORAGE_RAID,
225 "Serial ATA controller",
230 "Serial Attached SCSI controller",
235 "Non-volatile memory subsystem",
240 "Universal Flash Storage controller",
244 PCI_CLASS_MASS_STORAGE_OTHER,
245 "Other mass storage controller",
260 PCI_CLASS_NETWORK_ETHERNET,
261 "Ethernet controller",
265 PCI_CLASS_NETWORK_TOKENRING,
266 "Token Ring controller",
270 PCI_CLASS_NETWORK_FDDI,
275 PCI_CLASS_NETWORK_ATM,
280 PCI_CLASS_NETWORK_ISDN,
286 "WorldFip controller",
291 "PCMIG 2.14 Multi Computing",
296 "InfiniBand controller",
301 "Host fabric controller",
305 PCI_CLASS_NETWORK_OTHER,
306 "Other network controller",
324 "VGA-compatible controller",
329 "8514-compatible controller",
341 PCI_CLASS_DISPLAY_VGA,
346 PCI_CLASS_DISPLAY_XGA,
351 PCI_CLASS_DISPLAY_3D,
356 PCI_CLASS_DISPLAY_OTHER,
357 "Other display controller",
372 PCI_CLASS_MEDIA_VIDEO,
377 PCI_CLASS_MEDIA_AUDIO,
382 PCI_CLASS_MEDIA_TELEPHONE,
388 "High definition audio device",
392 PCI_CLASS_MEDIA_OTHER,
393 "Other multimedia device",
408 PCI_CLASS_MEMORY_RAM,
413 PCI_CLASS_MEMORY_FLASH,
414 "Flash memory controller",
418 PCI_CLASS_MEMORY_OTHER,
419 "Other memory controller",
434 PCI_CLASS_BRIDGE_HOST,
439 PCI_CLASS_BRIDGE_ISA,
444 PCI_CLASS_BRIDGE_EISA,
449 PCI_CLASS_BRIDGE_MCA,
454 PCI_CLASS_BRIDGE_P2P,
459 PCI_CLASS_BRIDGE_PCMCIA,
464 PCI_CLASS_BRIDGE_CARDBUS,
469 PCI_CLASS_BRIDGE_RACEWAY,
475 "Semi-transparent PCI-to-PCI bridge",
480 "InfiniBand-to-PCI host bridge",
485 "Advanced Switching to PCI host bridge",
489 PCI_CLASS_BRIDGE_OTHER,
490 "Other bridge device",
508 "Generic XT-compatible serial controller",
513 "16450-compatible serial controller",
518 "16550-compatible serial controller",
523 "16650-compatible serial controller",
528 "16750-compatible serial controller",
533 "16850-compatible serial controller",
538 "16950-compatible serial controller",
551 PCI_IF_PARALLEL_PORT,
556 PCI_IF_BI_DIR_PARALLEL_PORT,
557 "Bi-directional parallel port",
561 PCI_IF_ECP_PARALLEL_PORT,
566 PCI_IF_1284_CONTROLLER,
567 "IEEE1284 controller",
585 PCI_IF_GENERIC_MODEM,
591 "Hayes compatible modem, 16450-compatible interface",
596 "Hayes compatible modem, 16550-compatible interface",
601 "Hayes compatible modem, 16650-compatible interface",
606 "Hayes compatible modem, 16750-compatible interface",
623 PCI_SUBCLASS_PARALLEL,
624 "Parallel controller",
628 PCI_SUBCLASS_MULTIPORT_SERIAL,
629 "Multiport serial controller",
639 "GPIB (IEEE448.1/2) controller",
648 PCI_SUBCLASS_SCC_OTHER,
649 "Other communications device",
667 "Generic 8259 programmable interrupt controller",
672 "ISA programmable interrupt controller",
677 "EISA programmable interrupt controller",
681 PCI_IF_APIC_CONTROLLER,
682 "I/O APIC interrupt controller",
686 PCI_IF_APIC_CONTROLLER2,
687 "I/O x2 APIC interrupt controller",
701 "Generic 8237 DMA controller",
706 "ISA DMA controller",
711 "EISA DMA controller",
725 "Generic 8254 system timer",
740 "High Performance Event Timer",
754 "Generic RTC controller",
759 "ISA RTC controller",
772 "Programmable interrupt controller",
791 PCI_SUBCLASS_PNP_CONTROLLER,
792 "Generic PCI Hot-Plug controller",
797 "SD Host controller",
807 "Root Complex Event Collector",
811 PCI_SUBCLASS_PERIPHERAL_OTHER,
812 "Other system peripheral",
827 PCI_SUBCLASS_KEYBOARD,
828 "Keyboard controller",
837 PCI_SUBCLASS_MOUSE_CONTROLLER,
842 PCI_SUBCLASS_SCAN_CONTROLLER,
843 "Scanner controller",
847 PCI_SUBCLASS_GAMEPORT,
848 "Gameport controller",
852 PCI_SUBCLASS_INPUT_OTHER,
853 "Other input controller",
868 PCI_SUBCLASS_DOCKING_GENERIC,
869 "Generic docking station",
873 PCI_SUBCLASS_DOCKING_OTHER,
874 "Other docking station",
889 PCI_SUBCLASS_PROC_386,
894 PCI_SUBCLASS_PROC_486,
899 PCI_SUBCLASS_PROC_PENTIUM,
904 PCI_SUBCLASS_PROC_ALPHA,
909 PCI_SUBCLASS_PROC_POWERPC,
914 PCI_SUBCLASS_PROC_MIPS,
919 PCI_SUBCLASS_PROC_CO_PORC,
943 "IEEE 1394 FireWire controller",
947 PCI_IF_1394_OPEN_HCI,
948 "IEEE 1394 OHCI controller",
962 "Universal Serial Bus UHCI controller",
967 "Universal Serial Bus OHCI controller",
972 "Universal Serial Bus EHCI controller",
977 "Universal Serial Bus xHCI controller",
982 "USB4 Host Interface controller",
987 "Other Universal Serial Bus controller",
992 "Universal Serial Bus device",
1004 PCI_CLASS_SERIAL_FIREWIRE,
1005 "FireWire controller",
1009 PCI_CLASS_SERIAL_ACCESS_BUS,
1014 PCI_CLASS_SERIAL_SSA,
1019 PCI_CLASS_SERIAL_USB,
1020 "Universal Serial Bus controller",
1024 PCI_CLASS_SERIAL_FIBRECHANNEL,
1025 "Fibre Channel controller",
1029 PCI_CLASS_SERIAL_SMB,
1035 "InfiniBand controller",
1045 "SERCOS Interface Standard controller",
1050 "CANbus controller",
1055 "MIPI I3C Host Controller",
1060 "Other serial bus controller",
1076 "irDA-compatible controller",
1081 "Consumer IR controller",
1091 "Bluetooth controller",
1096 "Broadband controller",
1101 "Ethernet 802.11a controller",
1106 "Ethernet 802.11b controller",
1111 "Cellular controller",
1116 "Cellular controller plus Ethernet 802.11",
1120 PCI_SUBCLASS_WIRELESS_OTHER,
1121 "Other wireless controller",
1137 "Satellite TV controller",
1142 "Satellite audio controller",
1147 "Satellite voice controller",
1152 "Satellite data controller",
1157 "Other satellite controller",
1172 PCI_SUBCLASS_NET_COMPUT,
1173 "Network and computing encryption and decryption controller",
1177 PCI_SUBCLASS_ENTERTAINMENT,
1178 "Entertainment encryption and decryption controller",
1182 PCI_SUBCLASS_SECURITY_OTHER,
1183 "Other encryption and decryption controller",
1204 "Performance counters",
1209 "Communications synchronization plus time and frequency test/measurement",
1218 PCI_SUBCLASS_DPIO_OTHER,
1219 "Other data acquisition/signal processing controller",
1239 PCI_CLASS_MASS_STORAGE,
1240 "Mass storage controller",
1245 "Network controller",
1250 "Display controller",
1255 "Multimedia controller",
1259 PCI_CLASS_MEMORY_CONTROLLER,
1260 "Memory controller",
1270 "Simple communications controller",
1274 PCI_CLASS_SYSTEM_PERIPHERAL,
1275 "Base system peripheral",
1279 PCI_CLASS_INPUT_DEVICE,
1284 PCI_CLASS_DOCKING_STATION,
1289 PCI_CLASS_PROCESSOR,
1295 "Serial bus controller",
1300 "Wireless controller",
1304 PCI_CLASS_INTELLIGENT_IO,
1305 "Intelligent I/O controller",
1309 PCI_CLASS_SATELLITE,
1310 "Satellite communication controller",
1314 PCI_SECURITY_CONTROLLER,
1315 "Encryption/decryption controller",
1320 "Data acquisition and signal processing controller",
1325 "Processing accelerator",
1330 "Non-essential instrumentation function"
1340 OUT CONST CHAR8 **TextBaseClass,
1341 OUT CONST CHAR8 **TextSubClass
1352 BaseClassEntry = NULL;
1359 if (BaseClassEntry == NULL) {
1360 *TextBaseClass =
"Unknown class";
1361 *TextSubClass = NULL;
1365 *TextBaseClass = BaseClassEntry->
DescText;
1370 if (BaseClassEntry->LowerLevelClass == NULL) {
1371 *TextSubClass = NULL;
1376 SubClassEntry = NULL;
1377 while (BaseClassEntry->LowerLevelClass[Index].DescText != NULL) {
1378 if (BaseClassEntry->LowerLevelClass[Index].Code == SubClass) {
1379 SubClassEntry = &BaseClassEntry->LowerLevelClass[Index];
1389 if (SubClassEntry == NULL) {
1391 while (BaseClassEntry->LowerLevelClass[Index].DescText != NULL) {
1392 if (BaseClassEntry->LowerLevelClass[Index].Code == SubClass) {
1393 SubClassEntry = &BaseClassEntry->LowerLevelClass[Index];
1401 if (SubClassEntry == NULL) {
1402 *TextSubClass = NULL;
1409 if (SubClassEntry->LowerLevelClass == NULL) {
1410 *TextSubClass = SubClassEntry->DescText;
1415 InterfaceEntry = NULL;
1416 while (SubClassEntry->LowerLevelClass[Index].DescText != NULL) {
1417 if (SubClassEntry->LowerLevelClass[Index].Code == Interface) {
1418 InterfaceEntry = &SubClassEntry->LowerLevelClass[Index];
1425 if (InterfaceEntry == NULL) {
1426 *TextSubClass = SubClassEntry->DescText;
1430 *TextSubClass = InterfaceEntry->DescText;
1435 IN EFI_FILE_PROTOCOL *Root
1440 EFI_HANDLE *HandleBuffer;
1442 EFI_PCI_IO_PROTOCOL *PciIo;
1443 PCI_TYPE00 PciDevice;
1444 CONST CHAR8 *TextPciClass;
1445 CONST CHAR8 *TextPciSubClass;
1446 EFI_DEVICE_PATH_PROTOCOL *PciDevicePath;
1447 CHAR16 *TextPciDevicePath;
1450 UINTN FileBufferSize;
1451 CHAR16 TmpFileName[32];
1455 FileBufferSize = SIZE_1KB;
1456 FileBuffer = AllocateZeroPool (FileBufferSize);
1457 if (FileBuffer == NULL) {
1458 return EFI_OUT_OF_RESOURCES;
1461 Status =
gBS->LocateHandleBuffer (
1463 &gEfiPciIoProtocolGuid,
1468 if (EFI_ERROR (Status)) {
1469 DEBUG ((DEBUG_INFO,
"OCDM: No PCI devices found for dumping - %r\n", Status));
1470 FreePool (FileBuffer);
1474 for (Index = 0; Index < HandleCount; ++Index) {
1475 Status =
gBS->HandleProtocol (
1476 HandleBuffer[Index],
1477 &gEfiPciIoProtocolGuid,
1480 if (EFI_ERROR (Status)) {
1487 Status = PciIo->Pci.Read (
1489 EfiPciIoWidthUint32,
1491 sizeof (PCI_TYPE00) /
sizeof (UINT32),
1494 if (EFI_ERROR (Status)) {
1502 PciDevice.Hdr.ClassCode[2],
1503 PciDevice.Hdr.ClassCode[1],
1504 PciDevice.Hdr.ClassCode[0],
1508 if (TextPciSubClass != NULL) {
1533 "\n Vendor ID: 0x%04X, Device ID: 0x%04X, RevisionID: 0x%02X, ClassCode: 0x%02X%02X%02X",
1535 PciDevice.Hdr.VendorId,
1536 PciDevice.Hdr.DeviceId,
1537 PciDevice.Hdr.RevisionID,
1538 PciDevice.Hdr.ClassCode[2],
1539 PciDevice.Hdr.ClassCode[1],
1540 PciDevice.Hdr.ClassCode[0]
1545 if (!IS_PCI_BRIDGE (&PciDevice)) {
1549 ", SubsystemVendorID: 0x%04X, SubsystemID: 0x%04X",
1550 PciDevice.Device.SubsystemVendorID,
1551 PciDevice.Device.SubsystemID
1558 Status =
gBS->HandleProtocol (
1559 HandleBuffer[Index],
1561 (VOID **)&PciDevicePath
1563 if (!EFI_ERROR (Status)) {
1564 TextPciDevicePath = ConvertDevicePathToText (PciDevicePath, FALSE, FALSE);
1565 if (TextPciDevicePath != NULL) {
1569 "\n DevicePath: %s",
1573 FreePool (TextPciDevicePath);
1586 if (FileBuffer != NULL) {
1587 UnicodeSPrint (TmpFileName,
sizeof (TmpFileName), L
"PCIInfo.txt");
1588 Status =
OcSetFileData (Root, TmpFileName, FileBuffer, (UINT32)AsciiStrLen (FileBuffer));
1589 DEBUG ((DEBUG_INFO,
"OCDM: Dumped PCI info - %r\n", Status));
1591 FreePool (FileBuffer);
#define ARRAY_SIZE(Array)
EFI_STATUS OcSetFileData(IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL, IN CONST CHAR16 *FileName, IN CONST VOID *Buffer, IN UINT32 Size)
VOID EFIAPI OcAsciiPrintBuffer(IN OUT CHAR8 **AsciiBuffer, IN OUT UINTN *AsciiBufferSize, IN CONST CHAR8 *FormatString,...)
STATIC CONST PCI_CLASS_ENTRY mPciClass01MassStorage[]
STATIC CONST PCI_CLASS_ENTRY mPciClass08SystemPerip00[]
STATIC CONST PCI_CLASS_ENTRY mPciClass01MassStorage05[]
STATIC CONST PCI_CLASS_ENTRY mPciClass08SystemPerip01[]
STATIC CONST PCI_CLASS_ENTRY mPciClass08SystemPerip[]
STATIC CONST PCI_CLASS_ENTRY mPciClass02Network[]
STATIC CONST PCI_CLASS_ENTRY mPciClass05Memory[]
STATIC CONST PCI_CLASS_ENTRY mPciClass06Bridge[]
STATIC CONST PCI_CLASS_ENTRY mPciClass0CSerialBus[]
STATIC CONST PCI_CLASS_ENTRY mPciClass00PreClassCode[]
STATIC CONST PCI_CLASS_ENTRY mPciClass0CSerialBus03[]
STATIC CONST PCI_CLASS_ENTRY mPciClass03Display[]
STATIC CONST PCI_CLASS_ENTRY mPciClass01MassStorage09[]
STATIC CONST PCI_CLASS_ENTRY mPciClass04Multimedia[]
STATIC CONST PCI_CLASS_ENTRY mPciClass01MassStorage06[]
EFI_STATUS OcPciInfoDump(IN EFI_FILE_PROTOCOL *Root)
STATIC CONST PCI_CLASS_ENTRY mPciClass07SimpleComms01[]
STATIC CONST PCI_CLASS_ENTRY mPciClass01MassStorage00[]
STATIC CONST PCI_CLASS_ENTRY mPciClass11DataAcquisition[]
STATIC CONST PCI_CLASS_ENTRY mPciClass0BProcessor[]
struct PCI_CLASS_ENTRY_TAG PCI_CLASS_ENTRY
STATIC CONST PCI_CLASS_ENTRY mPciClass09Input[]
STATIC CONST PCI_CLASS_ENTRY mPciClass0DWireless[]
STATIC CONST PCI_CLASS_ENTRY mPciClass03Display00[]
STATIC CONST PCI_CLASS_ENTRY mPciClass08SystemPerip03[]
STATIC VOID GetPciDeviceClassText(IN UINT8 BaseClass, IN UINT8 SubClass, IN UINT8 Interface, OUT CONST CHAR8 **TextBaseClass, OUT CONST CHAR8 **TextSubClass)
STATIC CONST PCI_CLASS_ENTRY mPciClasses[]
STATIC CONST PCI_CLASS_ENTRY mPciClass07SimpleComms00[]
STATIC CONST PCI_CLASS_ENTRY mPciClass01MassStorage08[]
STATIC CONST PCI_CLASS_ENTRY mPciClass10EncryptionDecryption[]
STATIC CONST PCI_CLASS_ENTRY mPciClass08SystemPerip02[]
STATIC CONST PCI_CLASS_ENTRY mPciClass0CSerialBus00[]
STATIC CONST PCI_CLASS_ENTRY mPciClass0ADocking[]
STATIC CONST PCI_CLASS_ENTRY mPciClass0FSatellite[]
STATIC CONST PCI_CLASS_ENTRY mPciClass07SimpleComms[]
STATIC CONST PCI_CLASS_ENTRY mPciClass07SimpleComms03[]
EFI_GUID gEfiDevicePathProtocolGuid
CONST struct PCI_CLASS_ENTRY_TAG * LowerLevelClass