09_UEFI Service Binding Protocol - manojkumarpaladugu/UEFI-BIOS-Development GitHub Wiki
Introduction:
The Service Binding Protocol is not associated with a single GUID value. Instead, each Service Binding Protocol GUID value is paired with another protocol providing a specific set of service.
The protocol interfaces for all Service Binding Protocols are identical and contain the services CreateChild() and DestroyChild(). When CreateChild() is called, a new handle is created with the associated protocol installed. When DestroyChild() is called, the associated protocol is uninstalled and handle is freed.
struct _EFI_SERVICE_BINDING_PROTOCOL {
EFI_SERVICE_BINDING_CREATE_CHILD CreateChild;
EFI_SERVICE_BINDING_DESTROY_CHILD DestroyChild;
};
When to use?
For a new protocol, decision must be made to determine if the new protocol requires a Service Binding Protocol. Driver Binding Protocol is usually enough for managing devices on a common bus topology and for the simple layering of protocols on a single device. When more complex tree or graph topologies are required and, with the expectation that the services of the new protocol be required by multiple consumers, a Service Binding Protocol should be considered.
Sample Code:
#include
#include
#include
typedef struct {
UINT32 AbcField;
} ABC_PROTOCOL;
EFI_HANDLE gAbcServiceBindingHandle = NULL;
EFI_SERVICE_BINDING_PROTOCOL gAbcServiceBinding = {
AbcCreateChild,
AbcDestroyChild
};
ABC_PROTOCOL gAbc = {
0
};
EFI_STATUS
EFIAPI
AbcCreateChild(
IN EFI_SERVICE_BINDING_PROTOCOL* This,
IN OUT EFI_HANDLE* ChildHandle
)
{
EFI_HANDLE NewHandle;
NewHandle = NULL;
return gBS->InstallMultipleProtocolInterfaces(
&NewHandle,
&gAbcProtocolGuid,
&gAbc,
NULL
);
}
EFI_STATUS
EFIAPI
AbcDestroyChild(
IN EFI_SERVICE_BINDING_PROTOCOL* This,
IN EFI_HANDLE ChildHandle
)
{
return gBS->UninstallMultipleProtocolInterfaces(
ChildHandle,
&gAbcProtocolGuid,
&gAbc,
NULL
);
}
EFI_STATUS
EFIAPI
AbcDriverEntryPoint(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE* SystemTable
)
{
//
// Install Service Binding Protocol for ABC onto a new handle
//
return gBS->InstallMultipleProtocolInterfaces(
&gAbcServiceBindingHandle,
&gAbcServiceBindingProtocolGuid,
&gAbcServiceBinding,
NULL
);
}