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.