15.1 Driver Family Override Protocol Implementation
The implementation of the Driver Family Override Protocol is typically found in the file DriverFamilyOverride.c. Appendix A contains a template for a DriverFamilyOverride.c file for a UEFI Driver. The list of tasks to implement the Driver Family Override Protocol feature follow:
- Add global variable for the
EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL
instance toDriverFamilyOverride.c
. - Implement the
GetVersion()
service of the Driver Family Override ProtocolinDriverFamilyOverride.c
. - Install the Driver Family Override Protocol onto the same handle that theDriver Binding Protocol is installed.
- If the UEFI Driver produces multiple Driver Binding Protocols, install theDriver Family Override Protocol on the same handles as that of the DriverBinding Protocol.
- If the UEFI Driver supports the unload feature, uninstall all the DriverFamily Override Protocol instances in the
Unload()
function.
The Driver Family Override Protocol contains one service called
GetVersion()
that returns version value used by the UEFI Boot Service ConnectController()
to determine the order of Driver Binding Protocol used to start a specific controller. If the Driver Family Override Protocol is present, it is higher priority than the Bus Specific Driver Override Protocol, but lower than the Platform Driver Override Protocol. See the Chapter 3 and the Protocol Handler Services section of the UEFI Specification for details on how the UEFI Boot Service ConnectController()
selects the best UEFI Driver to manage a specific controller.For reference, the example below shows the protocol interface structure for the Driver Family Override Protocol. It is composed of a single service called
GetVersion()
.typedef struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL
EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL;
///
/// When installed, the Driver Family Override Protocol produces a GUID that
/// represents a family of drivers. Drivers with the same GUID are members of
/// the same family. When drivers are connected to controllers, drivers with a
/// higher revision value in the same driver family are connected with a higher
/// priority than drivers with a lower revision value in the same driver family.
/// The EFI Boot Service ConnectController() uses five rules to build a prioritized
/// list of drivers when a request is made to connect a driver to a controller.
/// The Driver Family Protocol rule is between the Platform Specific Driver
/// Override Protocol and above the Bus Specific Driver Override Protocol.
///
struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL {
EFI_DRIVER_FAMILY_OVERRIDE_GET_VERSION GetVersion;
};
The following example declares a global variable called
gAbcDriverFamilyOverride
with the single service called AbcGetVersion()
. The UEFI Boot Service InstallMultipleProtocolInterfaces()
is used to install the Driver Family Override Protocol instance gAbcDriverFamilyOverride
onto the same ImageHandle as which the Driver Binding Protocol instance gAbcDriverBinding
is installed.#include <Uefi.h>
#include <Protocol/DriverBinding.h>
#include <Protocol/DriverFamilyOverride.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#define ABC_VERSION 0x10
EFI_DRIVER_BINDING_PROTOCOL gAbcDriverBinding = {
AbcSupported,
AbcStart,
AbcStop,
ABC_VERSION,
NULL,
NULL
};
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL gAbcDriverFamilyOverride = {
AbcGetVersion
};
EFI_STATUS
EFIAPI
AbcDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
//
// Install driver model protocol(s) on ImageHandle
//
Status = EfiLibInstallDriverBinding (
ImageHandle, // ImageHandle
SystemTable, // SystemTable
&gAbcDriverBinding, // DriverBinding
ImageHandle // DriverBindingHandle
);
ASSERT_EFI_ERROR (Status);
//
// Install Driver Family Override Protocol onto ImageHandle
//
Status = gBS->InstallMultipleProtocolInterfaces (
&ImageHandle,
&gEfiDriverFamilyOverrideProtocolGuid,
&gAbcDriverFamilyOverride,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}
Last modified 2yr ago