/** @file | |
Support functions for managing protocol. | |
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _HAND_H_ | |
#define _HAND_H_ | |
#define EFI_HANDLE_SIGNATURE SIGNATURE_32('h','n','d','l') | |
/// | |
/// IHANDLE - contains a list of protocol handles | |
/// | |
typedef struct { | |
UINTN Signature; | |
/// All handles list of IHANDLE | |
LIST_ENTRY AllHandles; | |
/// List of PROTOCOL_INTERFACE's for this handle | |
LIST_ENTRY Protocols; | |
UINTN LocateRequest; | |
/// The Handle Database Key value when this handle was last created or modified | |
UINT64 Key; | |
} IHANDLE; | |
#define ASSERT_IS_HANDLE(a) ASSERT((a)->Signature == EFI_HANDLE_SIGNATURE) | |
#define PROTOCOL_ENTRY_SIGNATURE SIGNATURE_32('p','r','t','e') | |
/// | |
/// PROTOCOL_ENTRY - each different protocol has 1 entry in the protocol | |
/// database. Each handler that supports this protocol is listed, along | |
/// with a list of registered notifies. | |
/// | |
typedef struct { | |
UINTN Signature; | |
/// Link Entry inserted to mProtocolDatabase | |
LIST_ENTRY AllEntries; | |
/// ID of the protocol | |
EFI_GUID ProtocolID; | |
/// All protocol interfaces | |
LIST_ENTRY Protocols; | |
/// Registerd notification handlers | |
LIST_ENTRY Notify; | |
} PROTOCOL_ENTRY; | |
#define PROTOCOL_INTERFACE_SIGNATURE SIGNATURE_32('p','i','f','c') | |
/// | |
/// PROTOCOL_INTERFACE - each protocol installed on a handle is tracked | |
/// with a protocol interface structure | |
/// | |
typedef struct { | |
UINTN Signature; | |
/// Link on IHANDLE.Protocols | |
LIST_ENTRY Link; | |
/// Back pointer | |
IHANDLE *Handle; | |
/// Link on PROTOCOL_ENTRY.Protocols | |
LIST_ENTRY ByProtocol; | |
/// The protocol ID | |
PROTOCOL_ENTRY *Protocol; | |
/// The interface value | |
VOID *Interface; | |
/// OPEN_PROTOCOL_DATA list | |
LIST_ENTRY OpenList; | |
UINTN OpenListCount; | |
} PROTOCOL_INTERFACE; | |
#define OPEN_PROTOCOL_DATA_SIGNATURE SIGNATURE_32('p','o','d','l') | |
typedef struct { | |
UINTN Signature; | |
/// Link on PROTOCOL_INTERFACE.OpenList | |
LIST_ENTRY Link; | |
EFI_HANDLE AgentHandle; | |
EFI_HANDLE ControllerHandle; | |
UINT32 Attributes; | |
UINT32 OpenCount; | |
} OPEN_PROTOCOL_DATA; | |
#define PROTOCOL_NOTIFY_SIGNATURE SIGNATURE_32('p','r','t','n') | |
/// | |
/// PROTOCOL_NOTIFY - used for each register notification for a protocol | |
/// | |
typedef struct { | |
UINTN Signature; | |
PROTOCOL_ENTRY *Protocol; | |
/// All notifications for this protocol | |
LIST_ENTRY Link; | |
/// Event to notify | |
EFI_EVENT Event; | |
/// Last position notified | |
LIST_ENTRY *Position; | |
} PROTOCOL_NOTIFY; | |
/** | |
Finds the protocol entry for the requested protocol. | |
The gProtocolDatabaseLock must be owned | |
@param Protocol The ID of the protocol | |
@param Create Create a new entry if not found | |
@return Protocol entry | |
**/ | |
PROTOCOL_ENTRY * | |
CoreFindProtocolEntry ( | |
IN EFI_GUID *Protocol, | |
IN BOOLEAN Create | |
); | |
/** | |
Signal event for every protocol in protocol entry. | |
@param ProtEntry Protocol entry | |
**/ | |
VOID | |
CoreNotifyProtocolEntry ( | |
IN PROTOCOL_ENTRY *ProtEntry | |
); | |
/** | |
Finds the protocol instance for the requested handle and protocol. | |
Note: This function doesn't do parameters checking, it's caller's responsibility | |
to pass in valid parameters. | |
@param Handle The handle to search the protocol on | |
@param Protocol GUID of the protocol | |
@param Interface The interface for the protocol being searched | |
@return Protocol instance (NULL: Not found) | |
**/ | |
PROTOCOL_INTERFACE * | |
CoreFindProtocolInterface ( | |
IN IHANDLE *Handle, | |
IN EFI_GUID *Protocol, | |
IN VOID *Interface | |
); | |
/** | |
Removes Protocol from the protocol list (but not the handle list). | |
@param Handle The handle to remove protocol on. | |
@param Protocol GUID of the protocol to be moved | |
@param Interface The interface of the protocol | |
@return Protocol Entry | |
**/ | |
PROTOCOL_INTERFACE * | |
CoreRemoveInterfaceFromProtocol ( | |
IN IHANDLE *Handle, | |
IN EFI_GUID *Protocol, | |
IN VOID *Interface | |
); | |
/** | |
Connects a controller to a driver. | |
@param ControllerHandle Handle of the controller to be | |
connected. | |
@param ContextDriverImageHandles DriverImageHandle A pointer to an | |
ordered list of driver image | |
handles. | |
@param RemainingDevicePath RemainingDevicePath A pointer to | |
the device path that specifies a | |
child of the controller | |
specified by ControllerHandle. | |
@retval EFI_SUCCESS One or more drivers were | |
connected to ControllerHandle. | |
@retval EFI_OUT_OF_RESOURCES No enough system resources to | |
complete the request. | |
@retval EFI_NOT_FOUND No drivers were connected to | |
ControllerHandle. | |
**/ | |
EFI_STATUS | |
CoreConnectSingleController ( | |
IN EFI_HANDLE ControllerHandle, | |
IN EFI_HANDLE *ContextDriverImageHandles OPTIONAL, | |
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL | |
); | |
/** | |
Attempts to disconnect all drivers that are using the protocol interface being queried. | |
If failed, reconnect all drivers disconnected. | |
Note: This function doesn't do parameters checking, it's caller's responsibility | |
to pass in valid parameters. | |
@param UserHandle The handle on which the protocol is installed | |
@param Prot The protocol to disconnect drivers from | |
@retval EFI_SUCCESS Drivers using the protocol interface are all | |
disconnected | |
@retval EFI_ACCESS_DENIED Failed to disconnect one or all of the drivers | |
**/ | |
EFI_STATUS | |
CoreDisconnectControllersUsingProtocolInterface ( | |
IN EFI_HANDLE UserHandle, | |
IN PROTOCOL_INTERFACE *Prot | |
); | |
/** | |
Acquire lock on gProtocolDatabaseLock. | |
**/ | |
VOID | |
CoreAcquireProtocolLock ( | |
VOID | |
); | |
/** | |
Release lock on gProtocolDatabaseLock. | |
**/ | |
VOID | |
CoreReleaseProtocolLock ( | |
VOID | |
); | |
/** | |
Check whether a handle is a valid EFI_HANDLE | |
The gProtocolDatabaseLock must be owned | |
@param UserHandle The handle to check | |
@retval EFI_INVALID_PARAMETER The handle is NULL or not a valid EFI_HANDLE. | |
@retval EFI_SUCCESS The handle is valid EFI_HANDLE. | |
**/ | |
EFI_STATUS | |
CoreValidateHandle ( | |
IN EFI_HANDLE UserHandle | |
); | |
// | |
// Externs | |
// | |
extern EFI_LOCK gProtocolDatabaseLock; | |
extern LIST_ENTRY gHandleList; | |
extern UINT64 gHandleDatabaseKey; | |
#endif |