/*++ | |
Copyright (c) 2006, Intel Corporation | |
All rights reserved. This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: | |
hand.h | |
Abstract: | |
EFI internal protocol definitions | |
Revision History | |
--*/ | |
#ifndef _HAND_H_ | |
#define _HAND_H_ | |
// | |
// IHANDLE - contains a list of protocol handles | |
// | |
#define EFI_HANDLE_SIGNATURE EFI_SIGNATURE_32('h','n','d','l') | |
typedef struct { | |
UINTN Signature; | |
LIST_ENTRY AllHandles; // All handles list of IHANDLE | |
LIST_ENTRY Protocols; // List of PROTOCOL_INTERFACE's for this handle | |
UINTN LocateRequest; // | |
UINT64 Key; // The Handle Database Key value when this handle was last created or modified | |
} IHANDLE; | |
#define ASSERT_IS_HANDLE(a) ASSERT((a)->Signature == EFI_HANDLE_SIGNATURE) | |
// | |
// 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. | |
// | |
#define PROTOCOL_ENTRY_SIGNATURE EFI_SIGNATURE_32('p','r','t','e') | |
typedef struct { | |
UINTN Signature; | |
LIST_ENTRY AllEntries; // All entries | |
EFI_GUID ProtocolID; // ID of the protocol | |
LIST_ENTRY Protocols; // All protocol interfaces | |
LIST_ENTRY Notify; // Registerd notification handlers | |
} PROTOCOL_ENTRY; | |
// | |
// PROTOCOL_INTERFACE - each protocol installed on a handle is tracked | |
// with a protocol interface structure | |
// | |
#define PROTOCOL_INTERFACE_SIGNATURE EFI_SIGNATURE_32('p','i','f','c') | |
typedef struct { | |
UINTN Signature; | |
EFI_HANDLE Handle; // Back pointer | |
LIST_ENTRY Link; // Link on IHANDLE.Protocols | |
LIST_ENTRY ByProtocol; // Link on PROTOCOL_ENTRY.Protocols | |
PROTOCOL_ENTRY *Protocol; // The protocol ID | |
VOID *Interface; // The interface value | |
LIST_ENTRY OpenList; // OPEN_PROTOCOL_DATA list. | |
UINTN OpenListCount; | |
EFI_HANDLE ControllerHandle; | |
} PROTOCOL_INTERFACE; | |
#define OPEN_PROTOCOL_DATA_SIGNATURE EFI_SIGNATURE_32('p','o','d','l') | |
typedef struct { | |
UINTN Signature; | |
LIST_ENTRY Link; | |
EFI_HANDLE AgentHandle; | |
EFI_HANDLE ControllerHandle; | |
UINT32 Attributes; | |
UINT32 OpenCount; | |
} OPEN_PROTOCOL_DATA; | |
// | |
// PROTOCOL_NOTIFY - used for each register notification for a protocol | |
// | |
#define PROTOCOL_NOTIFY_SIGNATURE EFI_SIGNATURE_32('p','r','t','n') | |
typedef struct { | |
UINTN Signature; | |
PROTOCOL_ENTRY *Protocol; | |
LIST_ENTRY Link; // All notifications for this protocol | |
EFI_EVENT Event; // Event to notify | |
LIST_ENTRY *Position; // Last position notified | |
} PROTOCOL_NOTIFY; | |
// | |
// Internal prototypes | |
// | |
PROTOCOL_ENTRY * | |
CoreFindProtocolEntry ( | |
IN EFI_GUID *Protocol, | |
IN BOOLEAN Create | |
) | |
/*++ | |
Routine Description: | |
Finds the protocol entry for the requested protocol. | |
The gProtocolDatabaseLock must be owned | |
Arguments: | |
Protocol - The ID of the protocol | |
Create - Create a new entry if not found | |
Returns: | |
Protocol entry | |
--*/ | |
; | |
VOID | |
CoreNotifyProtocolEntry ( | |
IN PROTOCOL_ENTRY *ProtEntry | |
) | |
/*++ | |
Routine Description: | |
Signal event for every protocol in protocol entry. | |
Arguments: | |
ProtEntry - Protocol entry | |
Returns: | |
--*/ | |
; | |
PROTOCOL_INTERFACE * | |
CoreFindProtocolInterface ( | |
IN IHANDLE *Handle, | |
IN EFI_GUID *Protocol, | |
IN VOID *Interface | |
) | |
/*++ | |
Routine Description: | |
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. | |
Arguments: | |
Handle - The handle to search the protocol on | |
Protocol - GUID of the protocol | |
Interface - The interface for the protocol being searched | |
Returns: | |
Protocol instance (NULL: Not found) | |
--*/ | |
; | |
PROTOCOL_INTERFACE * | |
CoreRemoveInterfaceFromProtocol ( | |
IN IHANDLE *Handle, | |
IN EFI_GUID *Protocol, | |
IN VOID *Interface | |
) | |
/*++ | |
Routine Description: | |
Removes Protocol from the protocol list (but not the handle list). | |
Arguments: | |
Handle - The handle to remove protocol on. | |
Protocol - GUID of the protocol to be moved | |
Interface - The interface of the protocol | |
Returns: | |
Protocol Entry | |
--*/ | |
; | |
EFI_STATUS | |
CoreUnregisterProtocolNotify ( | |
IN EFI_EVENT Event | |
) | |
/*++ | |
Routine Description: | |
Removes all the events in the protocol database that match Event. | |
Arguments: | |
Event - The event to search for in the protocol database. | |
Returns: | |
EFI_SUCCESS when done searching the entire database. | |
--*/ | |
; | |
EFI_STATUS | |
CoreDisconnectControllersUsingProtocolInterface ( | |
IN EFI_HANDLE UserHandle, | |
IN PROTOCOL_INTERFACE *Prot | |
) | |
/*++ | |
Routine Description: | |
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. | |
Arguments: | |
UserHandle - The handle on which the protocol is installed | |
Prot - The protocol to disconnect drivers from | |
Returns: | |
EFI_SUCCESS - Drivers using the protocol interface are all disconnected | |
EFI_ACCESS_DENIED - Failed to disconnect one or all of the drivers | |
--*/ | |
; | |
VOID | |
CoreAcquireProtocolLock ( | |
VOID | |
) | |
/*++ | |
Routine Description: | |
Acquire lock on gProtocolDatabaseLock. | |
Arguments: | |
None | |
Returns: | |
None | |
--*/ | |
; | |
VOID | |
CoreReleaseProtocolLock ( | |
VOID | |
) | |
/*++ | |
Routine Description: | |
Release lock on gProtocolDatabaseLock. | |
Arguments: | |
None | |
Returns: | |
None | |
--*/ | |
; | |
EFI_STATUS | |
CoreValidateHandle ( | |
IN EFI_HANDLE UserHandle | |
) | |
/*++ | |
Routine Description: | |
Check whether a handle is a valid EFI_HANDLE | |
Arguments: | |
UserHandle - The handle to check | |
Returns: | |
EFI_INVALID_PARAMETER - The handle is NULL or not a valid EFI_HANDLE. | |
EFI_SUCCESS - The handle is valid EFI_HANDLE. | |
--*/ | |
; | |
// | |
// Externs | |
// | |
extern EFI_LOCK gProtocolDatabaseLock; | |
extern LIST_ENTRY gHandleList; | |
extern UINT64 gHandleDatabaseKey; | |
#endif |