]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskImpl.c
MdeModulePkg/RamDiskDxe: Add Memory Type selection support in Ramdisk HII
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / RamDiskDxe / RamDiskImpl.c
index 304d5d75cbc6c9bf472664787876336eec861f6b..b562bc1025827c936ab6c86a07b120e3b98cbfee 100644 (file)
@@ -2,6 +2,7 @@
   HII Config Access protocol implementation of RamDiskDxe driver.\r
 \r
   Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<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
@@ -19,7 +20,8 @@ CHAR16  mRamDiskStorageName[] = L"RAM_DISK_CONFIGURATION";
 RAM_DISK_CONFIG_PRIVATE_DATA mRamDiskConfigPrivateDataTemplate = {\r
   RAM_DISK_CONFIG_PRIVATE_DATA_SIGNATURE,\r
   {\r
-    EFI_PAGE_SIZE\r
+    EFI_PAGE_SIZE,\r
+    RAM_DISK_BOOT_SERVICE_DATA_MEMORY\r
   },\r
   {\r
     RamDiskExtractConfig,\r
@@ -287,6 +289,7 @@ RamDiskRouteConfig (
                              If creating from file, zero.\r
   @param[in] FileHandle      If creating raw, NULL. If creating from file, the\r
                              file handle.\r
+  @param[in] MemoryType      Type of memory to be used to create RAM Disk.\r
 \r
   @retval EFI_SUCCESS             RAM disk is created and registered.\r
   @retval EFI_OUT_OF_RESOURCES    Not enough storage is available to match the\r
@@ -296,18 +299,20 @@ RamDiskRouteConfig (
 EFI_STATUS\r
 HiiCreateRamDisk (\r
   IN UINT64                                 Size,\r
-  IN EFI_FILE_HANDLE                        FileHandle\r
+  IN EFI_FILE_HANDLE                        FileHandle,\r
+  IN UINT8                                  MemoryType\r
   )\r
 {\r
   EFI_STATUS                      Status;\r
   UINTN                           BufferSize;\r
-  UINT64                          StartingAddr;\r
+  UINT64                          *StartingAddr;\r
   EFI_INPUT_KEY                   Key;\r
   EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
   RAM_DISK_PRIVATE_DATA           *PrivateData;\r
   EFI_FILE_INFO                   *FileInformation;\r
 \r
   FileInformation = NULL;\r
+  StartingAddr    = NULL;\r
 \r
   if (FileHandle != NULL) {\r
     //\r
@@ -352,8 +357,23 @@ HiiCreateRamDisk (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  StartingAddr = (UINTN) AllocatePool ((UINTN) Size);\r
-  if (0 == StartingAddr) {\r
+  if (MemoryType == RAM_DISK_BOOT_SERVICE_DATA_MEMORY) {\r
+    Status = gBS->AllocatePool (\r
+                    EfiBootServicesData,\r
+                    (UINTN)Size,\r
+                    (VOID**)&StartingAddr\r
+                    );\r
+  } else if (MemoryType == RAM_DISK_RESERVED_MEMORY) {\r
+    Status = gBS->AllocatePool (\r
+                    EfiReservedMemoryType,\r
+                    (UINTN)Size,\r
+                    (VOID**)&StartingAddr\r
+                    );\r
+  } else {\r
+    Status = EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((StartingAddr == NULL) || EFI_ERROR(Status)) {\r
     do {\r
       CreatePopUp (\r
         EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
@@ -400,7 +420,7 @@ HiiCreateRamDisk (
   // Register the newly created RAM disk.\r
   //\r
   Status = RamDiskRegister (\r
-             StartingAddr,\r
+             ((UINT64)(UINTN) StartingAddr),\r
              Size,\r
              &gEfiVirtualDiskGuid,\r
              NULL,\r
@@ -594,6 +614,10 @@ RamDiskCallback (
       Value->u64 = EFI_PAGE_SIZE;\r
       ConfigPrivate->ConfigStore.Size = EFI_PAGE_SIZE;\r
       Status = EFI_SUCCESS;\r
+    } else if (QuestionId == CREATE_RAW_MEMORY_TYPE_QUESTION_ID) {\r
+      Value->u8 = RAM_DISK_BOOT_SERVICE_DATA_MEMORY;\r
+      ConfigPrivate->ConfigStore.MemType = RAM_DISK_BOOT_SERVICE_DATA_MEMORY;\r
+      Status = EFI_SUCCESS;\r
     }\r
     return Status;\r
   }\r
@@ -644,7 +668,11 @@ RamDiskCallback (
         // Create from file, RAM disk size is zero. It will be updated\r
         // according to the file size.\r
         //\r
-        Status = HiiCreateRamDisk (0, FileHandle);\r
+        Status = HiiCreateRamDisk (\r
+                   0,\r
+                   FileHandle,\r
+                   ConfigPrivate->ConfigStore.MemType\r
+                   );\r
         if (EFI_ERROR (Status)) {\r
           break;\r
         }\r
@@ -683,11 +711,19 @@ RamDiskCallback (
       ConfigPrivate->ConfigStore.Size = Value->u64;\r
       break;\r
 \r
+    case CREATE_RAW_MEMORY_TYPE_QUESTION_ID:\r
+      ConfigPrivate->ConfigStore.MemType = Value->u8;\r
+      break;\r
+\r
     case CREATE_RAW_SUBMIT_QUESTION_ID:\r
       //\r
       // Create raw, FileHandle is NULL.\r
       //\r
-      Status = HiiCreateRamDisk (ConfigPrivate->ConfigStore.Size, NULL);\r
+      Status = HiiCreateRamDisk (\r
+                 ConfigPrivate->ConfigStore.Size,\r
+                 NULL,\r
+                 ConfigPrivate->ConfigStore.MemType\r
+                 );\r
       if (EFI_ERROR (Status)) {\r
         break;\r
       }\r