Hackintosh PCI IDs: How to Match and Inject for a Bootable System
Learn to read, match, and inject PCI vendor/device IDs to get macOS working with legacy graphics, ethernet, audio, and USB hardware. Step-by-step for OpenCore, Clover, and DSDT.
When assembling a Hackintosh from legacy hardware, the single most common point of failure is a PCI device that macOS does not recognize. Unlike Windows, which loads generic drivers for most PCIe peripherals, macOS expects a specific combination of vendor ID, device ID, subsystem ID, and revision—all stored in the device's PCI configuration space. A GPU with the correct chipset but a non-Apple subsystem ID can produce a black screen. An Ethernet controller with a mismatched revision may never show a link light. Understanding how to inspect, match, and sometimes override these PCI identifiers is the difference between a bootable system and an expensive paperweight.
PCI Configuration Space: The Four Key Fields
Every PCI and PCIe device exposes a 256-byte configuration space. For Hackintosh compatibility, four fields matter:
- Vendor ID (VID) – 16-bit identifier assigned by the PCI SIG. Example: 0x10DE for NVIDIA, 0x1002 for AMD, 0x8086 for Intel.
- Device ID (DID) – 16-bit identifier for the specific chipset. Example: 0x0A65 for NVIDIA GK208 (GeForce GT 730).
- Subsystem Vendor ID (SSVID) – 16-bit identifier of the board manufacturer. Example: 0x1043 for ASUS, 0x1458 for Gigabyte.
- Subsystem ID (SSID) – 16-bit board-specific identifier set by the manufacturer.
macOS kernel extensions (kexts) use these values in their IOPCIMatch or IOPCIPrimaryMatch dictionaries. If the kext does not list your exact VID/DID combination, or if the SSVID/SSID triggers a different personality within the kext, the device may be ignored or misconfigured. This is why a Radeon HD 5770 from Sapphire can work out of the box while the same chip from PowerColor may require injection.

Reading PCI Identifiers on Real Hardware
Before buying or installing a component, verify its PCI identifiers. On a running macOS system, use the IORegistryExplorer application or the terminal command ioreg -l | grep IOPCIMatch. A more direct method is system_profiler SPPCIDataType, which lists every PCI device with its vendor and device IDs in hexadecimal. On Windows, the free tool HWiNFO64 displays the full PCI configuration space. Under Linux, lspci -nnvvv prints the VID, DID, SSVID, and SSID for each device.
For a board that has not yet been installed, look for a printed label or laser-etching on the chip itself. Graphics cards often have a sticker with the model number and a barcode; the PCI IDs are rarely on that sticker. Instead, find the GPU die and read the markings. For example, a GK208 die will have "GK208" laser-etched on the package. Cross-reference that die revision with publicly maintained databases such as the PCI ID Repository or the hardware database at the VGA BIOS collection site. Write down the four values before you install the device.
Matching Devices to macOS Kexts
Once you have the VID and DID, locate which kext handles that device. For AMD graphics, the AMDRadeonX4000.kext (and its variants) contain IOPCIMatch entries for GCN and later chips. NVIDIA Kepler cards are handled by GeForce.kext inside AppleGraphicsControl.kext. Intel I219-V Ethernet controllers use AppleIntelI210Ethernet.kext in newer macOS versions, but older I217 and I218 controllers require AppleIntelE1000e.kext from third-party sources or patched system kexts.
To inspect a kext's matching dictionary, open its Info.plist with a property list editor. Look for the IOKitPersonalities dictionary, then for each personality find the IOPCIMatch key. The value is a string of hexadecimal numbers separated by spaces. Example: 0x80862a09 0x80862a0c means the kext matches devices with VID 0x8086 (Intel) and DID 0x2a09 or 0x2a0c. If your device ID is not listed, the kext will not load for your hardware.
Injecting Missing PCI Identifiers
When a device has the correct chipset but a non-Apple subsystem combination, injection can force macOS to use the correct personality. Two methods are common:
DeviceProperties Injection in OpenCore or Clover
In OpenCore's config.plist, add a DeviceProperties block with the device's PciRoot path. Set device-id, vendor-id, subsystem-id, and subsystem-vendor-id as Data values (four bytes, little-endian). For Clover, the config.plist uses Devices → Properties with the same keys. This tells macOS to treat the device as if its PCI configuration space contains those values. A common use case is injecting a Radeon HD 5770's device ID to match the Apple iMac12,2 personality, which gives correct framebuffer assignment.
DSDT Override
For advanced users, the DSDT can include a _DSM method under the device's ACPI scope that sets the same four properties. This method is more invasive but survives bootloader changes. The process involves disassembling the DSDT with iasl, locating the PCI device node, and adding a Method (_DSM, 4, NotSerialized) block with Return (Package() {"device-id", Buffer() {0x68,0x68,0x00,0x00}, ...}). A detailed walkthrough for extracting and modifying your own DSDT is covered in the guide How to Extract Your Own DSDT for Hackintosh: macOS and Linux Methods, which also explains how to verify the extracted tables are unmodified.

Common PCI Device Pitfalls by Category
Ethernet Controllers
Intel I219-V (VID 0x8086, DID 0x15B8) works natively in macOS High Sierra and later, but only when the subsystem vendor is Apple or when injected. Realtek RTL8111 series requires the third-party RealtekRTL8111.kext; check its Info.plist for supported DID values. Older RTL8169 chips (DID 0x8169) are not supported in macOS versions past 10.13. Broadcom BCM577xx controllers (often found on Dell and HP motherboards) need a specific BCM5722D.kext and may require disabling ASPM in BIOS.
Audio Controllers
Realtek ALC892 and ALC887 are the most common onboard codecs. Their PCI VID is always 0x8086 (for the Intel HDA controller) and D ID 0x1C20 or 0x1E20. The codec itself is not a PCI device—it is accessed via the HDA controller. AppleALC.kext uses the codec's HDA configuration default pin widgets, not PCI IDs, but the kext will only load if the HDA controller's PCI ID is in its match list. For Intel 6-series chipsets, the HDA controller D ID is 0x1C20. For 7-series, 0x1E20. If your board uses a different HDA controller (e.g., 0x8C20 for 9-series], you must add it to AppleALC's Info.plist under IOPCIMatch.
USB Controllers
USB 3.0 controllers from Renesas (uPD720202) and ASMedia (ASM1042, ASM1142) often have PCI IDs not recognized by macOS. The GenericUSBXHCI.kext can handle many of them, but it requires the controller's PCI ID to be added to the kext's match list. The macOS native AppleUSBXHCI.kext only supports Intel and Apple-specific controllers. For ASM1142 (DID 0x1142), injection of the device ID to match an Intel XHCI controller is possible but may cause instability with USB 3.0 devices during sleep.
Verifying Injection Success
After applying any PCI identifier injection, boot macOS and run ioreg -l | grep -A 10 "IOPCIMatch". Look for the device's IORegistry entry. The IOPCIConfigured property should be Yes. Compare the vendor-id, device-id, subsystem-id, and subsystem-vendor-id properties in IORegistry to the values you injected. If they differ, the injection did not take effect—check the PciRoot path in your bootloader configuration. The path must exactly match the device's location in the ACPI namespace. Tools like gfxutil (available on macOS and Linux) can convert between PciRoot paths and ACPI device paths.
Risks and Backup Strategy
Misidentifying a PCI device can cause kernel panics at boot, loss of network or audio, or GPU acceleration failure. Before modifying any kext or DSDT, create a full backup of your EFI partition and your macOS installation. For DSDT overrides, also back up the original extracted DSDT. Keep a bootable USB stick with a known-good configuration. If the system fails to boot after injection, boot from the USB and restore the original files. Never edit a kext inside /System/Library/Extentions directly—use a copy in /Library/Extentions or use OpenCore's Kexts folder with Force set to True.
One final detail often overlooked: PCIe slot generation and lane count. A PCIe 2.0 x1 Ethernet card inserted into a PCIe 3.0 x16 slot will work, but its PCI configuration space may report the link speed incorrectly. macOS uses the reported link capabilities to negotiate power states. If the card reports a maximum link speed of 5.0 GT/s (PCIe 2.0) but the slot is capable of 8.0 GT/s, macOS may attempt to negotiate ASPM at the higher speed, causing the card to drop packets. Manually forcing the slot to PCIe 2.0 in BIOS or setting pcie_aspm=off in the boot arguments prevents this. For a practical example, an Intel PRO/1000 PT Dual Port server NIC (82571EB chipset) works reliably only when ASPM is disabled on the PCIe root port.
