18.2 PCI Bus Drivers

EDK II contains a generic PCI bus driver. It uses the services of the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL to enumerate PCI devices and produce a child handle with an EFI_DEVICE_PATH_PROTOCOL and an EFI_PCI_IO_PROTOCOL. The source code to this driver is in the EDK II package called MdeModulePkg in the directory MdeModulePkg/Bus/Pci/PciBusDxe.

This bus type can support producing one child handle at a time by parsing the RemainingDevicePath in its Supported() and Start() services. However, producing one child handle at a time for a PCI bus generally does not make sense. This is because the PCI bus driver needs to enumerate and assign resources to all of the PCI devices before even a single child handle can be produced.

It does not take much extra time to produce the child handles for all the enumerated PCI devices. Because of this, it is recommended that the PCI bus driver produce all of the PCI devices on the first call to Start().

If a UEFI based system firmware is ported to a new platform, most of the PCI-related changes occur in the implementation of the Root Bridge Driver producing the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instances.

TIP: PCI Bus Driver customizations are strongly discouraged because the PCI Bus Driver is designed to be conformant with the PCI Specification. Instead, focus platform specific customizations on the Root Bridge Driver that produced EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL and its PCI Device Drivers.