13.2 RunDiagnostics() Implementations
The RunDiagnostics()
service runs diagnostics on the controller a driver is
managing or a child the driver has produced. This service is not allowed to use
any of the consoleI/O-related protocols. Instead, the results of the
diagnostics are returned to the caller in a buffer. The caller may choose to
log the results or display them. The example below shows an empty
implementation of the RunDiagnostics()
service for the Driver Diagnostics 2
Protocol. The recommended implementation style shown allows the same RunDiagnostics()
service implementation to be shared between the Driver
Diagnostics Protocol and the Driver Diagnostics 2 Protocol.
Example 147-RunDiagnostics() Service
#include <Uefi.h>
#include <Protocol/DriverDiagnostics2.h>
EFI_STATUS
EFIAPI
AbcRunDiagnostics (
IN EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle, OPTIONAL
IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,
IN CHAR8 *Language,
OUT EFI_GUID **ErrorType,
OUT UINTN *BufferSize,
OUT CHAR16 **Buffer
)
{
}
The DiagnosticType parameter tells the driver the type of diagnostics to perform. Standard diagnostics must be implemented and test basic functionality. They should complete in less than 30 seconds. Extended diagnostics are recommended and may take more than 30 seconds to execute. Manufacturing diagnostics are intended to be used in manufacturing and test environments.
ErrorType, BufferSize, and Buffer are the return parameters that report
the results of the diagnostic. Buffer begins with a NULL
-terminated Unicode
string so the caller of the RunDiagnostics()
service can display a
human-readable diagnostic result. ErrorType is a GUID that defines the format
of the data buffer following the NULL
-terminated Unicode string. BufferSize
is the size of Buffer that includes the NULL
-terminated Unicode string and
the GUID-specific data buffer. The implementation of RunDiagnostics()
must
allocate Buffer using the service AllocatePool()
, and it is the caller's
responsibility to free this buffer with FreePool()
.
The Driver Diagnostics Protocols are available only for devices a driver is currently managing. Because UEFI supports connecting the minimum number of drivers and devices that are required to establish console and gain access to the boot device, there may be many unconnected devices that support diagnostics. As a result, when the user wishes to enter a platform configuration mode, the UEFI boot manager must connect all drivers to all devices, so that the user can be shown all devices supporting diagnostics.