//\r
// Driver Support Function Prototypes\r
//\r
-EFI_STATUS\r
-GetHandleFromDriverBinding (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindingNeed,\r
- OUT EFI_HANDLE *Handle \r
- );\r
-\r
EFI_STATUS \r
CoreConnectSingleController (\r
IN EFI_HANDLE ControllerHandle,\r
IN OUT UINTN *NumberOfSortedDriverBindingProtocols, \r
IN OUT EFI_DRIVER_BINDING_PROTOCOL **SortedDriverBindingProtocols,\r
IN UINTN DriverBindingHandleCount,\r
- IN OUT EFI_HANDLE *DriverBindingHandleBuffer\r
+ IN OUT EFI_HANDLE *DriverBindingHandleBuffer,\r
+ IN BOOLEAN IsImageHandle\r
)\r
/*++\r
\r
return;\r
}\r
\r
+ //\r
+ // If IsImageHandle is TRUE, then DriverBindingHandle is an image handle\r
+ // Find all the DriverBindingHandles associated with that image handle and add them to the sorted list\r
+ //\r
+ if (IsImageHandle) {\r
+ //\r
+ // Loop through all the Driver Binding Handles\r
+ //\r
+ for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
+ //\r
+ // Retrieve the Driver Binding Protocol associated with each Driver Binding Handle\r
+ //\r
+ Status = CoreHandleProtocol (\r
+ DriverBindingHandleBuffer[Index],\r
+ &gEfiDriverBindingProtocolGuid,\r
+ (VOID **)&DriverBinding\r
+ );\r
+ //\r
+ // If the ImageHandle associated with DriverBinding matches DriverBindingHandle,\r
+ // then add the DriverBindingProtocol[Index] to the sorted list\r
+ //\r
+ if (DriverBinding->ImageHandle == DriverBindingHandle) {\r
+ AddSortedDriverBindingProtocol (\r
+ DriverBindingHandleBuffer[Index],\r
+ NumberOfSortedDriverBindingProtocols, \r
+ SortedDriverBindingProtocols,\r
+ DriverBindingHandleCount,\r
+ DriverBindingHandleBuffer,\r
+ FALSE\r
+ );\r
+ }\r
+ }\r
+ return;\r
+ }\r
+\r
//\r
// Retrieve the Driver Binding Protocol from DriverBindingHandle\r
//\r
UINTN SortIndex;\r
BOOLEAN OneStarted;\r
BOOLEAN DriverFound;\r
- EFI_HANDLE DriverBindingHandle;\r
\r
- //\r
- // DriverBindingHandle is used for performance measurement, initialize it here just in case.\r
- //\r
- DriverBindingHandle = NULL;\r
//\r
// Initialize local variables\r
//\r
&NumberOfSortedDriverBindingProtocols, \r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ FALSE\r
);\r
}\r
}\r
&NumberOfSortedDriverBindingProtocols, \r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ TRUE\r
);\r
}\r
} while (!EFI_ERROR (Status));\r
//\r
// Get the Bus Specific Driver Override Protocol instance on the Controller Handle\r
//\r
- Status = CoreHandleProtocol(\r
+ Status = CoreHandleProtocol (\r
ControllerHandle, \r
&gEfiBusSpecificDriverOverrideProtocolGuid, \r
(VOID **)&BusSpecificDriverOverride\r
&NumberOfSortedDriverBindingProtocols, \r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ TRUE\r
);\r
}\r
} while (!EFI_ERROR (Status));\r
&NumberOfSortedDriverBindingProtocols, \r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ FALSE\r
);\r
}\r
\r
// A driver was found that supports ControllerHandle, so attempt to start the driver\r
// on ControllerHandle.\r
//\r
- PERF_CODE_BEGIN ();\r
- GetHandleFromDriverBinding (DriverBinding, &DriverBindingHandle);\r
- PERF_CODE_END ();\r
-\r
- PERF_START (DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+ PERF_START (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
Status = DriverBinding->Start (\r
DriverBinding, \r
ControllerHandle,\r
RemainingDevicePath\r
);\r
- PERF_END (DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+ PERF_END (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
\r
if (!EFI_ERROR (Status)) {\r
//\r
\r
return Status;\r
}\r
-\r
-EFI_STATUS\r
-GetHandleFromDriverBinding (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindingNeed,\r
- OUT EFI_HANDLE *Handle \r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Locate the driver binding handle which a specified driver binding protocol installed on.\r
-\r
-Arguments:\r
-\r
- DriverBindingNeed - The specified driver binding protocol.\r
- \r
- Handle - The driver binding handle which the protocol installed on.\r
- \r
-\r
-Returns:\r
-\r
- EFI_NOT_FOUND - Could not find the handle.\r
- \r
- EFI_SUCCESS - Successfully find the associated driver binding handle.\r
- \r
---*/ \r
- {\r
- EFI_STATUS Status ;\r
- EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
- UINTN DriverBindingHandleCount;\r
- EFI_HANDLE *DriverBindingHandleBuffer;\r
- UINTN Index;\r
- \r
- DriverBindingHandleCount = 0;\r
- DriverBindingHandleBuffer = NULL;\r
- *Handle = NULL_HANDLE;\r
- Status = CoreLocateHandleBuffer (\r
- ByProtocol, \r
- &gEfiDriverBindingProtocolGuid, \r
- NULL,\r
- &DriverBindingHandleCount, \r
- &DriverBindingHandleBuffer\r
- );\r
- if (EFI_ERROR (Status) || DriverBindingHandleCount == 0) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- for (Index = 0 ; Index < DriverBindingHandleCount; Index++ ) {\r
- Status = CoreOpenProtocol(\r
- DriverBindingHandleBuffer[Index],\r
- &gEfiDriverBindingProtocolGuid,\r
- (VOID **)&DriverBinding,\r
- gDxeCoreImageHandle,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- \r
- if (!EFI_ERROR (Status) && DriverBinding != NULL) {\r
- \r
- if ( DriverBinding == DriverBindingNeed ) {\r
- *Handle = DriverBindingHandleBuffer[Index];\r
- CoreFreePool (DriverBindingHandleBuffer); \r
- return EFI_SUCCESS ;\r
- }\r
- }\r
- }\r
- \r
- CoreFreePool (DriverBindingHandleBuffer);\r
- return EFI_NOT_FOUND ;\r
-}\r
-\r