]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Foundation/Library/Dxe/EfiDriverLib/EfiDriverModelLib.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / EfiDriverLib / EfiDriverModelLib.c
diff --git a/EdkCompatibilityPkg/Foundation/Library/Dxe/EfiDriverLib/EfiDriverModelLib.c b/EdkCompatibilityPkg/Foundation/Library/Dxe/EfiDriverLib/EfiDriverModelLib.c
new file mode 100644 (file)
index 0000000..5c2b47b
--- /dev/null
@@ -0,0 +1,289 @@
+/*++\r
+\r
+Copyright (c) 2004 - 2007, Intel Corporation                                                         \r
+All rights reserved. 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
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  EfiDriverModelLib.c\r
+\r
+Abstract:\r
+\r
+  Light weight lib to support EFI drivers.\r
+\r
+--*/\r
+\r
+#include "Tiano.h"\r
+#include "EfiDriverLib.h"\r
+\r
+EFI_STATUS\r
+EfiLibInstallDriverBinding (\r
+  IN EFI_HANDLE                   ImageHandle,\r
+  IN EFI_SYSTEM_TABLE             *SystemTable,\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding,\r
+  IN EFI_HANDLE                   DriverBindingHandle\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Intialize a driver by installing the Driver Binding Protocol onto the \r
+  driver's DriverBindingHandle.  This is typically the same as the driver's\r
+  ImageHandle, but it can be different if the driver produces multiple\r
+  DriverBinding Protocols.  This function also initializes the EFI Driver\r
+  Library that initializes the global variables gST, gBS, gRT.\r
+\r
+Arguments:\r
+\r
+  ImageHandle         - The image handle of the driver\r
+\r
+  SystemTable         - The EFI System Table that was passed to the driver's entry point\r
+\r
+  DriverBinding       - A Driver Binding Protocol instance that this driver is producing\r
+\r
+  DriverBindingHandle - The handle that DriverBinding is to be installe onto.  If this\r
+                        parameter is NULL, then a new handle is created.\r
+\r
+Returns: \r
+\r
+  EFI_SUCCESS is DriverBinding is installed onto DriverBindingHandle\r
+\r
+  Otherwise, then return status from gBS->InstallProtocolInterface()\r
+\r
+--*/\r
+{\r
+  EfiInitializeDriverLib (ImageHandle, SystemTable);\r
+\r
+  DriverBinding->ImageHandle          = ImageHandle;\r
+\r
+  DriverBinding->DriverBindingHandle  = DriverBindingHandle;\r
+\r
+  return gBS->InstallProtocolInterface (\r
+                &DriverBinding->DriverBindingHandle,\r
+                &gEfiDriverBindingProtocolGuid,\r
+                EFI_NATIVE_INTERFACE,\r
+                DriverBinding\r
+                );\r
+}\r
+\r
+EFI_STATUS\r
+EfiLibInstallAllDriverProtocols (\r
+  IN EFI_HANDLE                         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE                   * SystemTable,\r
+  IN EFI_DRIVER_BINDING_PROTOCOL        * DriverBinding,\r
+  IN EFI_HANDLE                         DriverBindingHandle,\r
+#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
+  IN EFI_COMPONENT_NAME2_PROTOCOL       * ComponentName, OPTIONAL\r
+#else\r
+  IN EFI_COMPONENT_NAME_PROTOCOL        * ComponentName, OPTIONAL\r
+#endif\r
+  IN EFI_DRIVER_CONFIGURATION_PROTOCOL  * DriverConfiguration, OPTIONAL\r
+  IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL    * DriverDiagnostics OPTIONAL\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Intialize a driver by installing the Driver Binding Protocol onto the \r
+  driver's DriverBindingHandle.  This is typically the same as the driver's\r
+  ImageHandle, but it can be different if the driver produces multiple\r
+  DriverBinding Protocols.  This function also initializes the EFI Driver\r
+  Library that initializes the global variables gST, gBS, gRT.\r
+\r
+Arguments:\r
+\r
+  ImageHandle         - The image handle of the driver\r
+\r
+  SystemTable         - The EFI System Table that was passed to the driver's entry point\r
+\r
+  DriverBinding       - A Driver Binding Protocol instance that this driver is producing\r
+\r
+  DriverBindingHandle - The handle that DriverBinding is to be installe onto.  If this\r
+                        parameter is NULL, then a new handle is created.\r
+\r
+  ComponentName       - A Component Name Protocol instance that this driver is producing\r
+\r
+  DriverConfiguration - A Driver Configuration Protocol instance that this driver is producing\r
+  \r
+  DriverDiagnostics   - A Driver Diagnostics Protocol instance that this driver is producing\r
+\r
+Returns: \r
+\r
+  EFI_SUCCESS if all the protocols were installed onto DriverBindingHandle\r
+\r
+  Otherwise, then return status from gBS->InstallProtocolInterface()\r
+\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Status = EfiLibInstallDriverBinding (ImageHandle, SystemTable, DriverBinding, DriverBindingHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (ComponentName != NULL) {\r
+    Status = gBS->InstallProtocolInterface (\r
+                    &DriverBinding->DriverBindingHandle,\r
+#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
+                    &gEfiComponentName2ProtocolGuid,\r
+#else\r
+                    &gEfiComponentNameProtocolGuid,\r
+#endif\r
+                    EFI_NATIVE_INTERFACE,\r
+                    ComponentName\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  if (DriverConfiguration != NULL) {\r
+    Status = gBS->InstallProtocolInterface (\r
+                    &DriverBinding->DriverBindingHandle,\r
+                    &gEfiDriverConfigurationProtocolGuid,\r
+                    EFI_NATIVE_INTERFACE,\r
+                    DriverConfiguration\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  if (DriverDiagnostics != NULL) {\r
+    Status = gBS->InstallProtocolInterface (\r
+                    &DriverBinding->DriverBindingHandle,\r
+                    &gEfiDriverDiagnosticsProtocolGuid,\r
+                    EFI_NATIVE_INTERFACE,\r
+                    DriverDiagnostics\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EfiLibTestManagedDevice (\r
+  IN EFI_HANDLE       ControllerHandle,\r
+  IN EFI_HANDLE       DriverBindingHandle,\r
+  IN EFI_GUID         *ManagedProtocolGuid\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Test to see if the controller is managed by a specific driver.\r
+\r
+Arguments:\r
+\r
+  ControllerHandle          - Handle for controller to test\r
+\r
+  DriverBindingHandle       - Driver binding handle for controller\r
+\r
+  ManagedProtocolGuid       - The protocol guid the driver opens on controller\r
+\r
+Returns: \r
+\r
+  EFI_SUCCESS     - The controller is managed by the driver\r
+\r
+  EFI_UNSUPPORTED - The controller is not managed by the driver\r
+\r
+--*/\r
+{\r
+  EFI_STATUS     Status;\r
+  VOID           *ManagedInterface;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  ManagedProtocolGuid,\r
+                  &ManagedInterface,\r
+                  DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
+    gBS->CloseProtocol (\r
+           ControllerHandle,\r
+           ManagedProtocolGuid,\r
+           DriverBindingHandle,\r
+           ControllerHandle\r
+           );\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (Status != EFI_ALREADY_STARTED) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EfiLibTestChildHandle (\r
+  IN EFI_HANDLE       ControllerHandle,\r
+  IN EFI_HANDLE       ChildHandle,\r
+  IN EFI_GUID         *ConsumedGuid\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Test to see if the child handle is the child of the controller\r
+\r
+Arguments:\r
+\r
+  ControllerHandle          - Handle for controller (parent)\r
+\r
+  ChildHandle               - Child handle to test\r
+\r
+  ConsumsedGuid             - Protocol guid consumed by child from controller\r
+\r
+Returns: \r
+\r
+  EFI_SUCCESS     - The child handle is the child of the controller\r
+\r
+  EFI_UNSUPPORTED - The child handle is not the child of the controller\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                            Status;\r
+  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY   *OpenInfoBuffer;\r
+  UINTN                                 EntryCount;\r
+  UINTN                                 Index;\r
+\r
+  //\r
+  // Retrieve the list of agents that are consuming one of the protocols\r
+  // on ControllerHandle that the children consume\r
+  //\r
+  Status = gBS->OpenProtocolInformation (\r
+                  ControllerHandle,\r
+                  ConsumedGuid,\r
+                  &OpenInfoBuffer,\r
+                  &EntryCount\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  //\r
+  // See if one of the agents is ChildHandle\r
+  //\r
+  Status = EFI_UNSUPPORTED;\r
+  for (Index = 0; Index < EntryCount; Index++) {\r
+    if (OpenInfoBuffer[Index].ControllerHandle == ChildHandle &&\r
+        OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {\r
+      Status = EFI_SUCCESS;\r
+    }\r
+  }\r
+  gBS->FreePool (OpenInfoBuffer);\r
+  return Status;\r
+}\r