]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c
MdeModulePkg/FaultTolerantWrite: Consume Variable Flash Info
[mirror_edk2.git] / MdeModulePkg / Universal / FaultTolerantWriteDxe / FtwMisc.c
index 661e1487673b0ffc1277b86a57cf5814b6796bb1..f1335870e7977d7b192255b69b4e81825616434f 100644 (file)
@@ -987,22 +987,43 @@ InitFtwDevice (
   OUT EFI_FTW_DEVICE  **FtwData\r
   )\r
 {\r
-  EFI_FTW_DEVICE  *FtwDevice;\r
+  EFI_STATUS            Status;\r
+  EFI_PHYSICAL_ADDRESS  WorkSpaceAddress;\r
+  UINT64                Size;\r
+  UINTN                 FtwWorkingSize;\r
+  EFI_FTW_DEVICE        *FtwDevice;\r
+\r
+  FtwWorkingSize = 0;\r
+\r
+  Status = GetVariableFlashFtwWorkingInfo (&WorkSpaceAddress, &Size);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = SafeUint64ToUintn (Size, &FtwWorkingSize);\r
+  // This driver currently assumes the size will be UINTN so assert the value is safe for now.\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Allocate private data of this driver,\r
   // Including the FtwWorkSpace[FTW_WORK_SPACE_SIZE].\r
   //\r
-  FtwDevice = AllocateZeroPool (sizeof (EFI_FTW_DEVICE) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize));\r
+  FtwDevice = AllocateZeroPool (sizeof (EFI_FTW_DEVICE) + FtwWorkingSize);\r
   if (FtwDevice == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  FtwDevice->WorkSpaceAddress = WorkSpaceAddress;\r
+  FtwDevice->WorkSpaceLength  = FtwWorkingSize;\r
+\r
+  Status = GetVariableFlashFtwSpareInfo (&FtwDevice->SpareAreaAddress, &Size);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = SafeUint64ToUintn (Size, &FtwDevice->SpareAreaLength);\r
+  // This driver currently assumes the size will be UINTN so assert the value is safe for now.\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   //\r
   // Initialize other parameters, and set WorkSpace as FTW_ERASED_BYTE.\r
   //\r
-  FtwDevice->WorkSpaceLength = (UINTN)PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
-  FtwDevice->SpareAreaLength = (UINTN)PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
   if ((FtwDevice->WorkSpaceLength == 0) || (FtwDevice->SpareAreaLength == 0)) {\r
     DEBUG ((DEBUG_ERROR, "Ftw: Workspace or Spare block does not exist!\n"));\r
     FreePool (FtwDevice);\r
@@ -1015,16 +1036,6 @@ InitFtwDevice (
   FtwDevice->FtwWorkSpaceLba = (EFI_LBA)(-1);\r
   FtwDevice->FtwSpareLba     = (EFI_LBA)(-1);\r
 \r
-  FtwDevice->WorkSpaceAddress = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFlashNvStorageFtwWorkingBase64);\r
-  if (FtwDevice->WorkSpaceAddress == 0) {\r
-    FtwDevice->WorkSpaceAddress = (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFlashNvStorageFtwWorkingBase);\r
-  }\r
-\r
-  FtwDevice->SpareAreaAddress = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFlashNvStorageFtwSpareBase64);\r
-  if (FtwDevice->SpareAreaAddress == 0) {\r
-    FtwDevice->SpareAreaAddress = (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFlashNvStorageFtwSpareBase);\r
-  }\r
-\r
   *FtwData = FtwDevice;\r
   return EFI_SUCCESS;\r
 }\r
@@ -1277,7 +1288,7 @@ InitFtwProtocol (
   FtwDevice->FtwLastWriteHeader = NULL;\r
   FtwDevice->FtwLastWriteRecord = NULL;\r
 \r
-  InitializeLocalWorkSpaceHeader ();\r
+  InitializeLocalWorkSpaceHeader (FtwDevice->WorkSpaceLength);\r
 \r
   //\r
   // Refresh the working space data from working block\r