/** @file\r
Support functions to connect/disconnect UEFI Driver model Protocol\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
\r
**/\r
\r
-#include <DxeMain.h>\r
+#include "DxeMain.h"\r
+#include "Handle.h"\r
\r
\r
//\r
/**\r
Connects one or more drivers to a controller.\r
\r
- @param ControllerHandle Handle of the controller to be \r
- connected. \r
- @param DriverImageHandle DriverImageHandle A pointer to an \r
- ordered list of driver image \r
- handles. \r
- @param RemainingDevicePath RemainingDevicePath A pointer to \r
- the device path that specifies a \r
- child of the controller specified \r
- by ControllerHandle. \r
- @param Recursive Whether the function would be \r
- called recursively or not. \r
+ @param ControllerHandle Handle of the controller to be\r
+ connected.\r
+ @param DriverImageHandle DriverImageHandle A pointer to an\r
+ ordered list of driver image\r
+ handles.\r
+ @param RemainingDevicePath RemainingDevicePath A pointer to\r
+ the device path that specifies a\r
+ child of the controller specified\r
+ by ControllerHandle.\r
+ @param Recursive Whether the function would be\r
+ called recursively or not.\r
\r
@return Status code.\r
\r
**/\r
-EFI_STATUS \r
+EFI_STATUS\r
EFIAPI\r
CoreConnectController (\r
IN EFI_HANDLE ControllerHandle,\r
EFI_HANDLE *ChildHandleBuffer;\r
UINTN ChildHandleCount;\r
UINTN Index;\r
- \r
+\r
//\r
// Make sure ControllerHandle is valid\r
//\r
//\r
AlignedRemainingDevicePath = NULL;\r
if (RemainingDevicePath != NULL) {\r
- AlignedRemainingDevicePath = CoreDuplicateDevicePath (RemainingDevicePath);\r
+ AlignedRemainingDevicePath = DuplicateDevicePath (RemainingDevicePath);\r
+\r
+ if (AlignedRemainingDevicePath == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
}\r
\r
//\r
//\r
for (Link = Handle->Protocols.ForwardLink, ChildHandleCount = 0; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
//\r
// Allocate a handle buffer for ControllerHandle's children\r
//\r
- ChildHandleBuffer = CoreAllocateBootServicesPool (ChildHandleCount * sizeof(EFI_HANDLE));\r
+ ChildHandleBuffer = AllocatePool (ChildHandleCount * sizeof(EFI_HANDLE));\r
+ if (ChildHandleBuffer == NULL) {\r
+ CoreReleaseProtocolLock ();\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
\r
//\r
// Fill in a handle buffer with ControllerHandle's children\r
//\r
for (Link = Handle->Protocols.ForwardLink, ChildHandleCount = 0; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
NULL,\r
NULL,\r
TRUE\r
- ); \r
+ );\r
}\r
\r
//\r
Add Driver Binding Protocols from Context Driver Image Handles to sorted\r
Driver Binding Protocol list.\r
\r
- @param DriverBindingHandle Handle of the driver binding \r
- protocol. \r
- @param NumberOfSortedDriverBindingProtocols Number Of sorted driver binding \r
- protocols \r
- @param SortedDriverBindingProtocols The sorted protocol list. \r
- @param DriverBindingHandleCount Driver Binding Handle Count. \r
- @param DriverBindingHandleBuffer The buffer of driver binding \r
- protocol to be modified. \r
- @param IsImageHandle Indicate whether \r
- DriverBindingHandle is an image \r
- handle \r
+ @param DriverBindingHandle Handle of the driver binding\r
+ protocol.\r
+ @param NumberOfSortedDriverBindingProtocols Number Of sorted driver binding\r
+ protocols\r
+ @param SortedDriverBindingProtocols The sorted protocol list.\r
+ @param DriverBindingHandleCount Driver Binding Handle Count.\r
+ @param DriverBindingHandleBuffer The buffer of driver binding\r
+ protocol to be modified.\r
+ @param IsImageHandle Indicate whether\r
+ DriverBindingHandle is an image\r
+ handle\r
\r
@return None.\r
\r
VOID\r
AddSortedDriverBindingProtocol (\r
IN EFI_HANDLE DriverBindingHandle,\r
- IN OUT UINTN *NumberOfSortedDriverBindingProtocols, \r
+ IN OUT UINTN *NumberOfSortedDriverBindingProtocols,\r
IN OUT EFI_DRIVER_BINDING_PROTOCOL **SortedDriverBindingProtocols,\r
IN UINTN DriverBindingHandleCount,\r
IN OUT EFI_HANDLE *DriverBindingHandleBuffer,\r
if (DriverBinding->ImageHandle == DriverBindingHandle) {\r
AddSortedDriverBindingProtocol (\r
DriverBindingHandleBuffer[Index],\r
- NumberOfSortedDriverBindingProtocols, \r
+ NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
DriverBindingHandleBuffer,\r
}\r
}\r
}\r
- \r
+\r
\r
/**\r
Connects a controller to a driver.\r
\r
- @param ControllerHandle Handle of the controller to be \r
- connected. \r
- @param ContextDriverImageHandles DriverImageHandle A pointer to an \r
- ordered list of driver image \r
- handles. \r
- @param RemainingDevicePath RemainingDevicePath A pointer to \r
- the device path that specifies a \r
- child of the controller \r
- specified by ControllerHandle. \r
-\r
- @retval EFI_SUCCESS One or more drivers were \r
- connected to ControllerHandle. \r
- @retval EFI_OUT_OF_RESOURCES No enough system resources to \r
- complete the request. \r
- @retval EFI_NOT_FOUND No drivers were connected to \r
+ @param ControllerHandle Handle of the controller to be\r
+ connected.\r
+ @param ContextDriverImageHandles DriverImageHandle A pointer to an\r
+ ordered list of driver image\r
+ handles.\r
+ @param RemainingDevicePath RemainingDevicePath A pointer to\r
+ the device path that specifies a\r
+ child of the controller\r
+ specified by ControllerHandle.\r
+\r
+ @retval EFI_SUCCESS One or more drivers were\r
+ connected to ControllerHandle.\r
+ @retval EFI_OUT_OF_RESOURCES No enough system resources to\r
+ complete the request.\r
+ @retval EFI_NOT_FOUND No drivers were connected to\r
ControllerHandle.\r
\r
**/\r
-EFI_STATUS \r
+EFI_STATUS\r
CoreConnectSingleController (\r
IN EFI_HANDLE ControllerHandle,\r
IN EFI_HANDLE *ContextDriverImageHandles OPTIONAL,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL \r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
)\r
{\r
EFI_STATUS Status;\r
// Get list of all Driver Binding Protocol Instances\r
//\r
Status = CoreLocateHandleBuffer (\r
- ByProtocol, \r
- &gEfiDriverBindingProtocolGuid, \r
+ ByProtocol,\r
+ &gEfiDriverBindingProtocolGuid,\r
NULL,\r
- &DriverBindingHandleCount, \r
+ &DriverBindingHandleCount,\r
&DriverBindingHandleBuffer\r
);\r
if (EFI_ERROR (Status) || (DriverBindingHandleCount == 0)) {\r
//\r
// Allocate a duplicate array for the sorted Driver Binding Protocol Instances\r
//\r
- SortedDriverBindingProtocols = CoreAllocateBootServicesPool (sizeof (VOID *) * DriverBindingHandleCount);\r
+ SortedDriverBindingProtocols = AllocatePool (sizeof (VOID *) * DriverBindingHandleCount);\r
if (SortedDriverBindingProtocols == NULL) {\r
CoreFreePool (DriverBindingHandleBuffer);\r
return EFI_OUT_OF_RESOURCES;\r
for (Index = 0; ContextDriverImageHandles[Index] != NULL; Index++) {\r
AddSortedDriverBindingProtocol (\r
ContextDriverImageHandles[Index],\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
DriverBindingHandleBuffer,\r
// Add the Platform Driver Override Protocol drivers for ControllerHandle next\r
//\r
Status = CoreLocateProtocol (\r
- &gEfiPlatformDriverOverrideProtocolGuid, \r
- NULL, \r
+ &gEfiPlatformDriverOverrideProtocolGuid,\r
+ NULL,\r
(VOID **) &PlatformDriverOverride\r
);\r
if (!EFI_ERROR (Status) && (PlatformDriverOverride != NULL)) {\r
if (!EFI_ERROR (Status)) {\r
AddSortedDriverBindingProtocol (\r
DriverImageHandle,\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
DriverBindingHandleBuffer,\r
// Get the Bus Specific Driver Override Protocol instance on the Controller Handle\r
//\r
Status = CoreHandleProtocol (\r
- ControllerHandle, \r
- &gEfiBusSpecificDriverOverrideProtocolGuid, \r
+ ControllerHandle,\r
+ &gEfiBusSpecificDriverOverrideProtocolGuid,\r
(VOID **) &BusSpecificDriverOverride\r
);\r
if (!EFI_ERROR (Status) && (BusSpecificDriverOverride != NULL)) {\r
if (!EFI_ERROR (Status)) {\r
AddSortedDriverBindingProtocol (\r
DriverImageHandle,\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
DriverBindingHandleBuffer,\r
for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
AddSortedDriverBindingProtocol (\r
DriverBindingHandleBuffer[Index],\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
DriverBindingHandleBuffer,\r
// EFI_NOT_READY, so it will be restarted\r
//\r
Status = CoreLocateHandleBuffer (\r
- ByProtocol, \r
- &gEfiDriverBindingProtocolGuid, \r
+ ByProtocol,\r
+ &gEfiDriverBindingProtocolGuid,\r
NULL,\r
- &NewDriverBindingHandleCount, \r
+ &NewDriverBindingHandleCount,\r
&NewDriverBindingHandleBuffer\r
);\r
CoreFreePool (NewDriverBindingHandleBuffer);\r
\r
//\r
// Loop through the sorted Driver Binding Protocol Instances in order, and see if\r
- // any of the Driver Binding Protocols support the controller specified by \r
+ // any of the Driver Binding Protocols support the controller specified by\r
// ControllerHandle.\r
//\r
DriverBinding = NULL;\r
for (Index = 0; (Index < NumberOfSortedDriverBindingProtocols) && !DriverFound; Index++) {\r
if (SortedDriverBindingProtocols[Index] != NULL) {\r
DriverBinding = SortedDriverBindingProtocols[Index];\r
+ PERF_START (DriverBinding->DriverBindingHandle, "DB:Support:", NULL, 0);\r
Status = DriverBinding->Supported(\r
- DriverBinding, \r
+ DriverBinding,\r
ControllerHandle,\r
RemainingDevicePath\r
);\r
+ PERF_END (DriverBinding->DriverBindingHandle, "DB:Support:", NULL, 0);\r
if (!EFI_ERROR (Status)) {\r
SortedDriverBindingProtocols[Index] = NULL;\r
DriverFound = TRUE;\r
// A driver was found that supports ControllerHandle, so attempt to start the driver\r
// on ControllerHandle.\r
//\r
- PERF_START (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+ PERF_START (DriverBinding->DriverBindingHandle, "DB:Start:", NULL, 0);\r
Status = DriverBinding->Start (\r
- DriverBinding, \r
+ DriverBinding,\r
ControllerHandle,\r
RemainingDevicePath\r
);\r
- PERF_END (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+ PERF_END (DriverBinding->DriverBindingHandle, "DB:Start:", NULL, 0);\r
\r
if (!EFI_ERROR (Status)) {\r
//\r
//\r
if (OneStarted) {\r
return EFI_SUCCESS;\r
- } \r
+ }\r
\r
//\r
// If no drivers started and RemainingDevicePath is an End Device Path Node, then return EFI_SUCCESS\r
if (IsDevicePathEnd (RemainingDevicePath)) {\r
return EFI_SUCCESS;\r
}\r
- } \r
+ }\r
\r
//\r
// Otherwise, no drivers were started on ControllerHandle, so return EFI_NOT_FOUND\r
/**\r
Disonnects a controller from a driver\r
\r
- @param ControllerHandle ControllerHandle The handle of \r
- the controller from which \r
- driver(s) are to be \r
- disconnected. \r
- @param DriverImageHandle DriverImageHandle The driver to \r
- disconnect from ControllerHandle. \r
- @param ChildHandle ChildHandle The handle of the \r
- child to destroy. \r
-\r
- @retval EFI_SUCCESS One or more drivers were \r
- disconnected from the controller. \r
- @retval EFI_SUCCESS On entry, no drivers are managing \r
- ControllerHandle. \r
- @retval EFI_SUCCESS DriverImageHandle is not NULL, \r
- and on entry DriverImageHandle is \r
- not managing ControllerHandle. \r
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid \r
- EFI_HANDLE. \r
- @retval EFI_INVALID_PARAMETER DriverImageHandle is not NULL, \r
- and it is not a valid EFI_HANDLE. \r
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL, and it \r
- is not a valid EFI_HANDLE. \r
- @retval EFI_OUT_OF_RESOURCES There are not enough resources \r
- available to disconnect any \r
- drivers from ControllerHandle. \r
- @retval EFI_DEVICE_ERROR The controller could not be \r
- disconnected because of a device \r
+ @param ControllerHandle ControllerHandle The handle of\r
+ the controller from which\r
+ driver(s) are to be\r
+ disconnected.\r
+ @param DriverImageHandle DriverImageHandle The driver to\r
+ disconnect from ControllerHandle.\r
+ @param ChildHandle ChildHandle The handle of the\r
+ child to destroy.\r
+\r
+ @retval EFI_SUCCESS One or more drivers were\r
+ disconnected from the controller.\r
+ @retval EFI_SUCCESS On entry, no drivers are managing\r
+ ControllerHandle.\r
+ @retval EFI_SUCCESS DriverImageHandle is not NULL,\r
+ and on entry DriverImageHandle is\r
+ not managing ControllerHandle.\r
+ @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid\r
+ EFI_HANDLE.\r
+ @retval EFI_INVALID_PARAMETER DriverImageHandle is not NULL,\r
+ and it is not a valid EFI_HANDLE.\r
+ @retval EFI_INVALID_PARAMETER ChildHandle is not NULL, and it\r
+ is not a valid EFI_HANDLE.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources\r
+ available to disconnect any\r
+ drivers from ControllerHandle.\r
+ @retval EFI_DEVICE_ERROR The controller could not be\r
+ disconnected because of a device\r
error.\r
\r
**/\r
-EFI_STATUS \r
+EFI_STATUS\r
EFIAPI\r
CoreDisconnectController (\r
IN EFI_HANDLE ControllerHandle,\r
// Get list of drivers that are currently managing ControllerHandle\r
//\r
DriverImageHandleBuffer = NULL;\r
- DriverImageHandleCount = 1; \r
- \r
+ DriverImageHandleCount = 1;\r
+\r
if (DriverImageHandle == NULL) {\r
//\r
// Look at each protocol interface for a match\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
}\r
}\r
CoreReleaseProtocolLock ();\r
- \r
+\r
//\r
// If there are no drivers managing this controller, then return EFI_SUCCESS\r
//\r
goto Done;\r
}\r
\r
- DriverImageHandleBuffer = CoreAllocateBootServicesPool (sizeof (EFI_HANDLE) * DriverImageHandleCount);\r
+ DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE) * DriverImageHandleCount);\r
if (DriverImageHandleBuffer == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
// Get the Driver Binding Protocol of the driver that is managing this controller\r
//\r
Status = CoreHandleProtocol (\r
- DriverImageHandle, \r
- &gEfiDriverBindingProtocolGuid, \r
+ DriverImageHandle,\r
+ &gEfiDriverBindingProtocolGuid,\r
(VOID **)&DriverBinding\r
);\r
- if (EFI_ERROR (Status)) {\r
+ if (EFI_ERROR (Status) || DriverBinding == NULL) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if (OpenData->AgentHandle == DriverImageHandle) {\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
ChildBufferCount++;\r
- } \r
+ }\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
DriverImageHandleValid = TRUE;\r
}\r
ChildHandleValid = FALSE;\r
ChildBuffer = NULL;\r
if (ChildBufferCount != 0) {\r
- ChildBuffer = CoreAllocateBootServicesPool (sizeof (EFI_HANDLE) * ChildBufferCount);\r
+ ChildBuffer = AllocatePool (sizeof (EFI_HANDLE) * ChildBufferCount);\r
if (ChildBuffer == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->AgentHandle == DriverImageHandle) &&\r
} else {\r
Status = EFI_NOT_FOUND;\r
}\r
- \r
-Done: \r
+\r
+Done:\r
\r
if (DriverImageHandleBuffer != NULL) {\r
CoreFreePool (DriverImageHandleBuffer);\r