]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDriver.c
MdeModulePkg: Add RamDiskDxe driver implementation
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / RamDiskDxe / RamDiskDriver.c
diff --git a/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDriver.c b/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDriver.c
new file mode 100644 (file)
index 0000000..7d068b2
--- /dev/null
@@ -0,0 +1,170 @@
+/** @file\r
+  The driver entry point for RamDiskDxe driver.\r
+\r
+  Copyright (c) 2016, 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
+  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
+**/\r
+\r
+#include "RamDiskImpl.h"\r
+\r
+//\r
+// Handle for the EFI_RAM_DISK_PROTOCOL instance\r
+//\r
+EFI_HANDLE  mRamDiskHandle = NULL;\r
+\r
+//\r
+// The EFI_RAM_DISK_PROTOCOL instances that is installed onto the driver\r
+// handle\r
+//\r
+EFI_RAM_DISK_PROTOCOL  mRamDiskProtocol = {\r
+  RamDiskRegister,\r
+  RamDiskUnregister\r
+};\r
+\r
+//\r
+// RamDiskDxe driver maintains a list of registered RAM disks.\r
+//\r
+LIST_ENTRY  RegisteredRamDisks;\r
+UINTN       ListEntryNum;\r
+\r
+\r
+/**\r
+  The entry point for RamDiskDxe driver.\r
+\r
+  @param[in] ImageHandle     The image handle of the driver.\r
+  @param[in] SystemTable     The system table.\r
+\r
+  @retval EFI_ALREADY_STARTED     The driver already exists in system.\r
+  @retval EFI_OUT_OF_RESOURCES    Fail to execute entry point due to lack of\r
+                                  resources.\r
+  @retval EFI_SUCCES              All the related protocols are installed on\r
+                                  the driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RamDiskDxeEntryPoint (\r
+  IN EFI_HANDLE                   ImageHandle,\r
+  IN EFI_SYSTEM_TABLE             *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  RAM_DISK_CONFIG_PRIVATE_DATA    *ConfigPrivate;\r
+  VOID                            *DummyInterface;\r
+\r
+  //\r
+  // If already started, return.\r
+  //\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiRamDiskProtocolGuid,\r
+                  NULL,\r
+                  &DummyInterface\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_INFO, "Driver already started!\n"));\r
+    return EFI_ALREADY_STARTED;\r
+  }\r
+\r
+  //\r
+  // Create a private data structure.\r
+  //\r
+  ConfigPrivate = AllocateCopyPool (sizeof (RAM_DISK_CONFIG_PRIVATE_DATA), &mRamDiskConfigPrivateDataTemplate);\r
+  if (ConfigPrivate == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  //\r
+  // Install RAM disk configuration form\r
+  //\r
+  Status = InstallRamDiskConfigForm (ConfigPrivate);\r
+  if (EFI_ERROR (Status)) {\r
+    goto ErrorExit;\r
+  }\r
+\r
+  //\r
+  // Install the EFI_RAM_DISK_PROTOCOL and RAM disk private data onto a\r
+  // new handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &mRamDiskHandle,\r
+                  &gEfiRamDiskProtocolGuid,\r
+                  &mRamDiskProtocol,\r
+                  &gEfiCallerIdGuid,\r
+                  ConfigPrivate,\r
+                  NULL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ErrorExit;\r
+  }\r
+\r
+  //\r
+  // Initialize the list of registered RAM disks maintained by the driver\r
+  //\r
+  InitializeListHead (&RegisteredRamDisks);\r
+\r
+  return EFI_SUCCESS;\r
+\r
+ErrorExit:\r
+  if (ConfigPrivate != NULL) {\r
+    UninstallRamDiskConfigForm (ConfigPrivate);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Unload the RamDiskDxe driver and its configuration form.\r
+\r
+  @param[in] ImageHandle     The driver's image handle.\r
+\r
+  @retval EFI_SUCCESS             The RamDiskDxe driver and its configuration\r
+                                  form is unloaded.\r
+  @retval Others                  Failed to unload the form.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RamDiskDxeUnload (\r
+  IN EFI_HANDLE                   ImageHandle\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  RAM_DISK_CONFIG_PRIVATE_DATA    *ConfigPrivate;\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  mRamDiskHandle,\r
+                  &gEfiCallerIdGuid,\r
+                  (VOID **) &ConfigPrivate\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  ASSERT (ConfigPrivate->Signature == RAM_DISK_CONFIG_PRIVATE_DATA_SIGNATURE);\r
+\r
+  //\r
+  // Unregister all registered RAM disks\r
+  //\r
+  UnregisterAllRamDisks ();\r
+\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+         mRamDiskHandle,\r
+         &gEfiRamDiskProtocolGuid,\r
+         &mRamDiskProtocol,\r
+         &gEfiCallerIdGuid,\r
+         ConfigPrivate,\r
+         NULL\r
+         );\r
+\r
+  UninstallRamDiskConfigForm (ConfigPrivate);\r
+\r
+  return EFI_SUCCESS;\r
+}\r