14.1 Driver Health Protocol Implementation

The implementation of the Driver Health Protocol is typically found in the file DriverHealth.c. Appendix A contains a template for a DriverHealth.c file for a UEFI Driver. The list of tasks to implement the Driver Health Protocol feature follow:
  • Add global variable for the EFI_DRIVER_HEALTH_PROTOCOL instance to
    DriverHealth.c.
  • Add private fields, as required, to the design of the private context data
    structure that supports storing the current health status of a device and
    managing repair operations.
  • Implement the GetHealthStatus() service of the Driver Health Protocol in
    DriverHealth.c.
  • Implement the Repair() service of the Driver Health Protocol in
    DriverHealth.c.
  • Install the Driver Health Protocol onto the same handle as that of the Driver
    Binding Protocol.
  • If the UEFI Driver produces multiple Driver Binding Protocols, install the
    Driver Health Protocol on the same handles as those of the Driver Binding
    Protocol.
  • If the UEFI Driver supports the unload feature, uninstall all the Driver
    Health Protocol instances in the Unload() function.
The example below shows the protocol interface structure for the Driver Health Protocol for reference and is composed of two services; GetHealthStatus() and Repair().

Example 150-Driver Health Protocol

typedef struct _EFI_DRIVER_HEALTH_PROTOCOL EFI_DRIVER_HEALTH_PROTOCOL;
///
/// When installed, the Driver Health Protocol produces a collection of services
/// that allow the health status for a controller to be retrieved. If a controller
/// is not in a usable state, status messages may be reported to the user, repair
/// operations can be invoked, and the user may be asked to make software and/or
/// hardware configuration changes.
///
struct _EFI_DRIVER_HEALTH_PROTOCOL {
EFI_DRIVER_HEALTH_GET_HEALTH_STATUS GetHealthStatus;
EFI_DRIVER_HEALTH_REPAIR Repair;
};
This example declares a global variable called gAbcDriverHealth with the services AbcGetHealthStatus() and AbcRepair(). The UEFI Boot Service InstallMultipleProtocolInterfaces() is used to install the Driver Health Protocol instance gAbcDriverHealth onto the same ImageHandle as that of the Driver Binding Protocol instance gAbcDriverBinding

Example 151-Install Driver Health Protocol

#include <Uefi.h>
#include <Protocol/DriverBinding.h>
#include <Protocol/DriverHealth.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_HEALTH_PROTOCOL gAbcDriverHealth = {
AbcGetHealthStatus,
AbcRepair
};
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,
&gEfiDriverHealthProtocolGuid,
&gAbcDriverHealth,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}