]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Hand/DriverSupport.c
Update ConnectController() to convert an ImageHandle retrieved from the Platform...
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Hand / DriverSupport.c
index 511acff6bda04bad9f678641a476a6767f13b2b7..29b457297f1467146078344d47e6fa8247cd8b67 100644 (file)
@@ -28,12 +28,6 @@ BOOLEAN mRepairLoadedImage = FALSE;
 //\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
@@ -282,7 +276,8 @@ AddSortedDriverBindingProtocol (
   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
@@ -321,6 +316,41 @@ Returns:
     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
@@ -405,12 +435,7 @@ Returns:
   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
@@ -452,7 +477,8 @@ Returns:
         &NumberOfSortedDriverBindingProtocols, \r
         SortedDriverBindingProtocols,\r
         DriverBindingHandleCount,\r
-        DriverBindingHandleBuffer\r
+        DriverBindingHandleBuffer,\r
+        FALSE\r
         );\r
     }\r
   }\r
@@ -479,7 +505,8 @@ Returns:
           &NumberOfSortedDriverBindingProtocols, \r
           SortedDriverBindingProtocols,\r
           DriverBindingHandleCount,\r
-          DriverBindingHandleBuffer\r
+          DriverBindingHandleBuffer,\r
+          TRUE\r
           );\r
       }\r
     } while (!EFI_ERROR (Status));\r
@@ -488,7 +515,7 @@ Returns:
   //\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
@@ -506,7 +533,8 @@ Returns:
           &NumberOfSortedDriverBindingProtocols, \r
           SortedDriverBindingProtocols,\r
           DriverBindingHandleCount,\r
-          DriverBindingHandleBuffer\r
+          DriverBindingHandleBuffer,\r
+          TRUE\r
           );\r
       }\r
     } while (!EFI_ERROR (Status));\r
@@ -522,7 +550,8 @@ Returns:
       &NumberOfSortedDriverBindingProtocols, \r
       SortedDriverBindingProtocols,\r
       DriverBindingHandleCount,\r
-      DriverBindingHandleBuffer\r
+      DriverBindingHandleBuffer,\r
+      FALSE\r
       );\r
   }\r
 \r
@@ -593,17 +622,13 @@ Returns:
           // 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
@@ -955,74 +980,3 @@ Done:
 \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