Some PCI devices have a series of identical devices on a single device, normally behind a PCI bridge. These devices may require additional work if they need to be controlled by a single instance of the UEFI driver. Take the following figure as a sample device.
It may be required that the driver in the Option ROM control all 3 controllers on the PCI device. To do this, use the following actions:
Supported() function, make sure that the UEFI Driver supports the
controller that is passed into the
Support() function. The first controller
passed in could be any of the controllers on a PCI Card.
Supported() function, make sure the function does not touch or
change the HW state. This is very important. If the PCI I/O instance is
already opened (if some other application or driver is already managing the
controller), return an error. See Chapter 9 of this guide and the EFI
Driver Binding Protocol section of the UEFI Specification for details on
the error return codes from the Driver Binding Protocol
Start() function for the first controller on the PCI Card, open the
PCI I/O protocol instances on the other handles on the same PCI Card using
EFI_OPEN_PROTOCOL_BY_DRIVER attribute. This informs all other UEFI
Drivers in the platform that all the controllers on the PCI Card are already
To scan for other PCI controllers on the same PCI Card, use the UEFI Boot
Service LocateHandleBuffer() to find all handles in the Handle Database
supporting the PCI I/O Protocol. Use the PCI I/O Protocol function
GetLocation()to evaluate whether or not the PCI controller is on the same PCI
bus number. Take care to not modify the HW state of any PCI I/O Protocol
instance during this evaluation.
Stop() function, undo everything that was done in
Start(). Use a
private context data structure to keep track of the information required to
Stop() operation in these more complex use cases.