7.2 UEFI Driver Model

Drivers that follow the UEFI driver model are not allowed to touch any hardware in their driver entry point. In fact, these types of drivers do very little in their driver entry point.

They are required to register protocol interfaces in the Handle Database and may also choose to register HII packages in the HII Database, register an Unload() service in the UEFI Driver's Loaded Image Protocol, and create events that are signaled when an operating system calls ExitBootServices() or SetVirtualAddressMap(). This design allows these types of drivers to be loaded at any point in the system initialization sequence because their driver entry points depend only on a few of the UEFI boot services. The items registered in the driver entry point are used later in the boot sequence to initialize, configure, or diagnose devices required to boot an operating system.

All UEFI drivers following the UEFI driver model must install one or more instances of the Driver Binding Protocol onto handles in the handle database. The first Driver Binding Protocol is typically installed onto the ImageHandle passed into the UEFI Driver entry point. Additional instances of the Driver Binding Protocol must be installed onto new handles in the Handle Database.

The EDK II library UefiLib provides four functions that simplify the implementation of the driver entry point of a UEFI driver. The examples in this section make use of these driver initialization functions as shown in the following example.

Example 88-EDK II UefiLib driver initialization functions
EFI_STATUS
EFIAPI
EfiLibInstallDriverBinding (
  IN CONST EFI_HANDLE ImageHandle,
  IN CONST EFI_SYSTEM_TABLE       *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,
  IN EFI_HANDLE DriverBindingHandle
  );

EFI_STATUS
EFIAPI
EfiLibInstallAllDriverProtocols (
  IN CONST EFI_HANDLE                                  ImageHandle,
  IN CONST EFI_SYSTEM_TABLE                            *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL                       *DriverBinding,
  IN EFI_HANDLE                                        DriverBindingHandle,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL                 *ComponentName,
  OPTIONAL IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL  *DriverConfiguration, OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL             *DriverDiagnostics OPTIONAL
  );

EFI_STATUS
EFIAPI
EfiLibInstallDriverBindingComponentName2 (
  IN CONST EFI_HANDLE                    ImageHandle,
  IN CONST EFI_SYSTEM_TABLE              *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL         *DriverBinding,
  IN EFI_HANDLE                          DriverBindingHandle,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL   *ComponentName, OPTIONAL
  IN CONST EFI_COMPONENT_NAME2_PROTOCOL  *ComponentName2 OPTIONAL
  );

EFI_STATUS
EFIAPI
EfiLibInstallAllDriverProtocols2 (
  IN CONST EFI_HANDLE                          ImageHandle,
  IN CONST EFI_SYSTEM_TABLE                    *SystemTable,
  IN EFI_DRIVER_BINDING_PROTOCOL               *DriverBinding,
  IN EFI_HANDLE                                DriverBindingHandle,
  IN CONST EFI_COMPONENT_NAME_PROTOCOL         *ComponentName, OPTIONAL
  IN CONST EFI_COMPONENT_NAME2_PROTOCOL        *ComponentName2, OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL   *DriverConfiguration, OPTIONAL
  IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL  *DriverConfiguration2, OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL     *DriverDiagnostics, OPTIONAL
  IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL    *DriverDiagnostics2 OPTIONAL
  );

EfiLibInstallDriverBinding() installs the Driver Binding Protocol onto the handle specified by DriverBindingHandle. DriverBindingHandle is typically the same as ImageHandle, but if it is NULL, the Driver Binding Protocol is installed onto a newly created handle. This function is typically used by a UEFI Driver that does not implement any of the optional driver features.

EfiLibInstallAllDriverProtocols() installs the Driver Binding Protocol, and the driverrelated protocols from the older UEFI Specification (and EFI Specification), onto the handle specified by DriverBindingHandle. The optional driver-related protocols are defined as OPTIONAL because they can be NULL if a driver is not producing that specific optional protocol. Once again, the DriverBindingHandle is typically the same as ImageHandle, but if it is NULL, all driver-related protocols are installed onto a newly created handle. This function is typically used by a UEFI Driver required to be compatible with the EFI 1.10 Specification.

EfiLibInstallDriverBindingComponentName2() installs the Driver Binding Protocol and the Component Name Protocols onto the handle specified by DriverBindingHandle. The optional driver-related protocols are defined as OPTIONAL because they can be NULL if a driver is not producing that specific optional protocol. Once again, the DriverBindingHandle is typically the same as ImageHandle, but if it is NULL, all driverrelated protocols are installed onto a newly created handle. This function is typically used by a UEFI Driver that implements the Component Name Protocols that are strongly recommended.

EfiLibInstallAllDriverProtocols2() installs the Driver Binding Protocol, Component Name Protocols, Driver Configuration Protocols, and Driver Diagnostics Protocols onto the handle specified by DriverBindingHandle. The optional driver-related protocols are defined as OPTIONAL because they can be NULL if a driver is not producing that specific optional protocol. Once again, the DriverBindingHandle is typically the same as ImageHandle, but if it is NULL, all driver-related protocols are installed onto a newly created handle. This function is typically used by a UEFI Driver required to be compatible with all versions of the UEFI Specification and EFI Specification.