]> git.proxmox.com Git - mirror_edk2.git/commitdiff
retire gEfiAlternateFvBlockGuid. All platform FvbRuntimeDxe drivers will not produce...
authoreric_tian <eric_tian@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 12 Mar 2009 05:10:53 +0000 (05:10 +0000)
committereric_tian <eric_tian@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 12 Mar 2009 05:10:53 +0000 (05:10 +0000)
FaultTolerantWrite driver and variable driver will register notification event to locate right protocol.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7865 6f19259b-4bc3-4df7-8a09-765794883524

14 files changed:
DuetPkg/FvbRuntimeService/DUETFwh.inf
DuetPkg/FvbRuntimeService/FWBlockService.c
DuetPkg/FvbRuntimeService/FwBlockService.h
MdeModulePkg/Include/Guid/AlternateFvBlock.h [deleted file]
MdeModulePkg/MdeModulePkg.dec
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.c
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
Nt32Pkg/FvbServicesRuntimeDxe/FWBlockService.c
Nt32Pkg/FvbServicesRuntimeDxe/FvbInfo.c
Nt32Pkg/FvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
UnixPkg/FvbServicesRuntimeDxe/FWBlockService.c
UnixPkg/FvbServicesRuntimeDxe/FvbInfo.c
UnixPkg/FvbServicesRuntimeDxe/UnixFwh.inf

index 9a73ae8110b2d4253987239231d11e16b33ac00c..b00ea7b5f1931745c57f97a7ac684e5c93c8b303 100644 (file)
@@ -51,7 +51,6 @@
 [Guids]\r
   gEfiFlashMapHobGuid\r
   gEfiHobListGuid\r
-  gEfiAlternateFvBlockGuid\r
 \r
 [Protocols]\r
   gEfiSimpleFileSystemProtocolGuid\r
index f5260a5eaa9609aae594aeb062d94cff687ac868..664a4cffc6e9b38253012c05e661f5de07bd3c4f 100644 (file)
@@ -1632,17 +1632,6 @@ Returns:
       //\r
       ASSERT (FALSE);\r
     }\r
-    //\r
-    // Install FVB Extension Protocol on the same handle\r
-    //\r
-    Status = gBS->InstallMultipleProtocolInterfaces (\r
-                    &FwbHandle,\r
-                    &gEfiAlternateFvBlockGuid,\r
-                    NULL,\r
-                    NULL\r
-                    );\r
-\r
-    ASSERT_EFI_ERROR (Status);\r
 \r
     FwhInstance = (EFI_FW_VOL_INSTANCE *)\r
       (\r
index eddde81b4a8b4a4e6c1b666e6a0d89a7b5d5d520..bec2572a3cde401d201f770aa3bd5915a56174a3 100644 (file)
@@ -31,7 +31,6 @@ Abstract:
 #include <Guid/EventGroup.h>\r
 #include <Guid/FirmwareFileSystem2.h>\r
 #include <Protocol/FirmwareVolumeBlock.h>\r
-#include <Guid/AlternateFvBlock.h>\r
 #include <Protocol/DevicePath.h>\r
 #include <Protocol/SimpleFileSystem.h>\r
 #include <Protocol/BlockIo.h>\r
@@ -39,7 +38,6 @@ Abstract:
 #include <Guid/SystemNvDataGuid.h>\r
 #include <Guid/FlashMapHob.h>\r
 #include <Guid/HobList.h>\r
-#include <Guid/AlternateFvBlock.h>\r
 \r
 //\r
 // The Library classes this module consumes\r
diff --git a/MdeModulePkg/Include/Guid/AlternateFvBlock.h b/MdeModulePkg/Include/Guid/AlternateFvBlock.h
deleted file mode 100644 (file)
index a5e81f0..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/** @file\r
-\r
-  This file defines the Alternate Firmware Volume Block Guid, which is \r
-  used to specify that the full funcationality FVB protocol is installed\r
-  that support read, write and erase capability for block devices.\r
-\r
-Copyright (c) 2006 - 2008, 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
-**/\r
-\r
-#ifndef __ALT_FVB_GUID_H__\r
-#define __ALT_FVB_GUID_H__\r
-\r
-#define EFI_ALTERNATE_FV_BLOCK_GUID \\r
-  { \\r
-    0xf496922d, 0x172f, 0x4bbc, {0xa1, 0xeb, 0xe, 0xeb, 0x94, 0x9c, 0x34, 0x86 } \\r
-  }\r
-\r
-extern EFI_GUID gEfiAlternateFvBlockGuid;\r
-\r
-#endif\r
index b5f86f5b2617f4d6df130b7ed807122984183f89..ebd59e17c308f50e24d0b8ed3388a9a82d073a39 100644 (file)
 \r
 [LibraryClasses.common]\r
   ##  @libraryclass  IpIo layer upon EFI IP4 Protocol.\r
-  #   Ihis library is only intended to be used by UEFI network stack modules.\r
+  #   This library is only intended to be used by UEFI network stack modules.\r
   IpIoLib|Include/Library/IpIoLib.h\r
   \r
   ##  @libraryclass  Basic function for UEFI network stack.\r
-  #   Ihis library is only intended to be used by UEFI network stack modules.\r
+  #   This library is only intended to be used by UEFI network stack modules.\r
   NetLib|Include/Library/NetLib.h\r
   \r
   ##  @libraryclass  The helper routines to access UDP service.\r
-  #   Ihis library is only intended to be used by UEFI network stack modules.\r
+  #   This library is only intended to be used by UEFI network stack modules.\r
   UdpIoLib|Include/Library/UdpIoLib.h\r
   \r
   ##  @libraryclass  Defines a set of methods to reset whole system.\r
@@ -51,7 +51,7 @@
   RecoveryLib|Include/Library/RecoveryLib.h\r
   \r
   ##  @libraryclass  Basic platform driver override functions.\r
-  #   Ihis library is only intended to be used by Platform Driver Override Dxe Driver and Application.\r
+  #   This library is only intended to be used by Platform Driver Override Dxe Driver and Application.\r
   PlatformDriverOverrideLib|Include/Library/PlatformDriverOverrideLib.h\r
 \r
   ##  @libraryclass  Provides HII related functions.\r
   ## Include/Guid/SystemNvDataGuid.h\r
   gEfiSystemNvDataFvGuid         = { 0xFFF12B8D, 0x7696, 0x4C8B, { 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50 }}\r
   \r
-  ## Alternate Firmware Volume Block Guid specify that the additional \r
-  #  FVB protocol is installed into FVB handle\r
-  ## Include/Guid/AlternateFvBlock.h\r
-  gEfiAlternateFvBlockGuid       = { 0xF496922D, 0x172F, 0x4BBC, { 0xA1, 0xEB, 0x0E, 0xEB, 0x94, 0x9C, 0x34, 0x86 }}\r
-  \r
   ## Guid specify the device is the console out device.\r
   ## Include/Guid/ConsoleOutDevice.h\r
   gEfiConsoleOutDeviceGuid       = { 0xD3B36F2C, 0xD551, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}\r
   ## Capsule update hob and variable guid\r
   ## Include/Guid/CapsuleVendor.h\r
   gEfiCapsuleVendorGuid          = { 0x711C703F, 0xC285, 0x4B10, { 0xA3, 0xB0, 0x36, 0xEC, 0xBD, 0x3C, 0x8B, 0xE2 }}\r
\r
+  \r
   ## Guid specifiy the device is the StdErr device.\r
   ## Include/Guid/StandardErrorDevice.h\r
   gEfiStandardErrorDeviceGuid    = { 0xD3B36F2D, 0xD551, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}\r
   \r
-  \r
   ## Guid acted as variable store header's signature and to specify the variable list entries put in the EFI system table.\r
   ## Include/Guid/VariableFormat.h\r
   gEfiVariableGuid           = { 0xddcf3616, 0x3275, 0x4164, { 0x98, 0xb6, 0xfe, 0x85, 0x70, 0x7f, 0xfe, 0x7d }}\r
index 53352881c4233aab40eb2397e6dac70aa176ef74..e0ac6ee17c87e2da01d33a71285f8670c130b736 100644 (file)
@@ -53,6 +53,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "FaultTolerantWrite.h"\r
 \r
+EFI_EVENT          mFvbRegistration = NULL;\r
 \r
 //\r
 // Fault Tolerant Write Protocol API\r
@@ -862,116 +863,80 @@ FtwGetLastWrite (
   return Status;\r
 }\r
 \r
-/**\r
-  This function is the entry point of the Fault Tolerant Write driver.\r
-\r
-  @param ImageHandle     A handle for the image that is initializing this driver\r
-  @param SystemTable     A pointer to the EFI system table\r
-\r
-  @return EFI_SUCCESS           FTW has finished the initialization\r
-  @retval EFI_NOT_FOUND         Locate FVB protocol error\r
-  @retval EFI_OUT_OF_RESOURCES  Allocate memory error\r
-  @retval EFI_VOLUME_CORRUPTED  Firmware volume is error\r
-  @retval EFI_ABORTED           FTW initialization error\r
-\r
-**/\r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
-InitializeFaultTolerantWrite (\r
-  IN EFI_HANDLE         ImageHandle,\r
-  IN EFI_SYSTEM_TABLE   *SystemTable\r
+FvbNotificationEvent (\r
+  IN  EFI_EVENT       Event,\r
+  IN  VOID            *Context\r
   )\r
 {\r
-  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *Fvb;\r
-  UINTN                               Index;\r
+  EFI_STATUS                          Status;\r
   EFI_HANDLE                          *HandleBuffer;\r
   UINTN                               HandleCount;\r
+  UINTN                               Index;\r
+  EFI_PHYSICAL_ADDRESS                FvbBaseAddress;\r
+  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *Fvb;\r
   EFI_FIRMWARE_VOLUME_HEADER          *FwVolHeader;\r
-  EFI_PHYSICAL_ADDRESS                BaseAddress;\r
+  EFI_FVB_ATTRIBUTES_2                Attributes;\r
   EFI_FTW_DEVICE                      *FtwDevice;\r
-  EFI_FAULT_TOLERANT_WRITE_HEADER     *FtwHeader;\r
-  UINTN                               Length;\r
-  EFI_STATUS                          Status;\r
-  UINTN                               Offset;\r
   EFI_FV_BLOCK_MAP_ENTRY              *FvbMapEntry;\r
   UINT32                              LbaIndex;\r
+  UINTN                               Length;\r
+  EFI_FAULT_TOLERANT_WRITE_HEADER     *FtwHeader;\r
+  UINTN                               Offset;\r
   EFI_HANDLE                          FvbHandle;\r
 \r
-  //\r
-  // Allocate Private data of this driver,\r
-  // INCLUDING THE FtwWorkSpace[FTW_WORK_SPACE_SIZE].\r
-  //\r
+  FtwDevice = (EFI_FTW_DEVICE *)Context;\r
   FvbHandle = NULL;\r
-  FtwDevice = NULL;\r
-  FtwDevice = AllocatePool (sizeof (EFI_FTW_DEVICE) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize));\r
-  if (FtwDevice == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  ZeroMem (FtwDevice, sizeof (EFI_FTW_DEVICE));\r
-  FtwDevice->Signature = FTW_DEVICE_SIGNATURE;\r
+  Fvb       = NULL;\r
 \r
   //\r
-  // Initialize other parameters, and set WorkSpace as FTW_ERASED_BYTE.\r
-  //\r
-\r
-  FtwDevice->WorkSpaceAddress = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageFtwWorkingBase);\r
-  FtwDevice->WorkSpaceLength  = (UINTN) PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
-\r
-  FtwDevice->SpareAreaAddress = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageFtwSpareBase);\r
-  FtwDevice->SpareAreaLength  = (UINTN) PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
-\r
-  if ((FtwDevice->WorkSpaceLength == 0) || (FtwDevice->SpareAreaLength == 0)) {\r
-    DEBUG ((EFI_D_ERROR, "Ftw: Workspace or Spare block does not exist!\n"));\r
-    FreePool (FtwDevice);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // Locate FVB protocol by handle\r
+  // Locate all handles of Fvb protocol\r
   //\r
   Status = gBS->LocateHandleBuffer (\r
-                  ByProtocol,\r
-                  &gEfiFirmwareVolumeBlockProtocolGuid,\r
-                  NULL,\r
-                  &HandleCount,\r
-                  &HandleBuffer\r
-                  );\r
+                ByProtocol,\r
+                &gEfiFirmwareVolumeBlockProtocolGuid,\r
+                NULL,\r
+                &HandleCount,\r
+                &HandleBuffer\r
+                );\r
   if (EFI_ERROR (Status)) {\r
-    FreePool (FtwDevice);\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  if (HandleCount <= 0) {\r
-    FreePool (FtwDevice);\r
-    return EFI_NOT_FOUND;\r
+    return;\r
   }\r
 \r
-  Fvb                         = NULL;\r
-  FtwDevice->FtwFvBlock       = NULL;\r
-  FtwDevice->FtwBackupFvb     = NULL;\r
-  FtwDevice->FtwWorkSpaceLba  = (EFI_LBA) (-1);\r
-  FtwDevice->FtwSpareLba      = (EFI_LBA) (-1);\r
+  //\r
+  // Get the FVB to access variable store\r
+  //\r
   for (Index = 0; Index < HandleCount; Index += 1) {\r
     Status = gBS->HandleProtocol (\r
-                    HandleBuffer[Index],\r
-                    &gEfiFirmwareVolumeBlockProtocolGuid,\r
-                    (VOID **) &Fvb\r
-                    );\r
+                  HandleBuffer[Index],\r
+                  &gEfiFirmwareVolumeBlockProtocolGuid,\r
+                  (VOID **) &Fvb\r
+                  );\r
     if (EFI_ERROR (Status)) {\r
-      FreePool (FtwDevice);\r
-      return Status;\r
+      Status = EFI_NOT_FOUND;\r
+      break;\r
     }\r
 \r
-    Status = Fvb->GetPhysicalAddress (Fvb, &BaseAddress);\r
+    //\r
+    // Ensure this FVB protocol supported Write operation.\r
+    //\r
+    Status = Fvb->GetAttributes (Fvb, &Attributes);\r
+    if (EFI_ERROR (Status) || ((Attributes & EFI_FVB2_WRITE_STATUS) == 0)) {\r
+      continue;     \r
+    }\r
+    //\r
+    // Compare the address and select the right one\r
+    //\r
+    Status = Fvb->GetPhysicalAddress (Fvb, &FvbBaseAddress);\r
     if (EFI_ERROR (Status)) {\r
       continue;\r
     }\r
 \r
-    FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) BaseAddress);\r
-\r
-    if ((FtwDevice->WorkSpaceAddress >= BaseAddress) &&\r
-        ((FtwDevice->WorkSpaceAddress + FtwDevice->WorkSpaceLength) <= (BaseAddress + FwVolHeader->FvLength))\r
-        ) {\r
+    FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) FvbBaseAddress);\r
+    if ((FtwDevice->FtwFvBlock == NULL) && (FtwDevice->WorkSpaceAddress >= FvbBaseAddress) &&\r
+      ((FtwDevice->WorkSpaceAddress + FtwDevice->WorkSpaceLength) <= (FvbBaseAddress + FwVolHeader->FvLength))\r
+      ) {\r
       FtwDevice->FtwFvBlock = Fvb;\r
       //\r
       // To get the LBA of work space\r
@@ -982,23 +947,23 @@ InitializeFaultTolerantWrite (
         //\r
         FvbMapEntry = &FwVolHeader->BlockMap[0];\r
         for (LbaIndex = 1; LbaIndex <= FvbMapEntry->NumBlocks; LbaIndex += 1) {\r
-            if ((FtwDevice->WorkSpaceAddress >= (BaseAddress + FvbMapEntry->Length * (LbaIndex - 1)))\r
-              && (FtwDevice->WorkSpaceAddress < (BaseAddress + FvbMapEntry->Length * LbaIndex))) {\r
+          if ((FtwDevice->WorkSpaceAddress >= (FvbBaseAddress + FvbMapEntry->Length * (LbaIndex - 1)))\r
+              && (FtwDevice->WorkSpaceAddress < (FvbBaseAddress + FvbMapEntry->Length * LbaIndex))) {\r
             FtwDevice->FtwWorkSpaceLba = LbaIndex - 1;\r
             //\r
             // Get the Work space size and Base(Offset)\r
             //\r
             FtwDevice->FtwWorkSpaceSize = FtwDevice->WorkSpaceLength;\r
-            FtwDevice->FtwWorkSpaceBase = (UINTN) (FtwDevice->WorkSpaceAddress - (BaseAddress + FvbMapEntry->Length * (LbaIndex - 1)));\r
+            FtwDevice->FtwWorkSpaceBase = (UINTN) (FtwDevice->WorkSpaceAddress - (FvbBaseAddress + FvbMapEntry->Length * (LbaIndex - 1)));\r
             break;\r
           }\r
         }\r
       }\r
     }\r
-\r
-    if ((FtwDevice->SpareAreaAddress >= BaseAddress) &&\r
-        ((FtwDevice->SpareAreaAddress + FtwDevice->SpareAreaLength) <= (BaseAddress + FwVolHeader->FvLength))\r
-        ) {\r
+    \r
+    if ((FtwDevice->FtwBackupFvb == NULL) && (FtwDevice->SpareAreaAddress >= FvbBaseAddress) &&\r
+      ((FtwDevice->SpareAreaAddress + FtwDevice->SpareAreaLength) <= (FvbBaseAddress + FwVolHeader->FvLength))\r
+      ) {\r
       FtwDevice->FtwBackupFvb = Fvb;\r
       //\r
       // To get the LBA of spare\r
@@ -1009,21 +974,21 @@ InitializeFaultTolerantWrite (
         //\r
         FvbMapEntry = &FwVolHeader->BlockMap[0];\r
         for (LbaIndex = 1; LbaIndex <= FvbMapEntry->NumBlocks; LbaIndex += 1) {\r
-            if ((FtwDevice->SpareAreaAddress >= (BaseAddress + FvbMapEntry->Length * (LbaIndex - 1)))\r
-              && (FtwDevice->SpareAreaAddress < (BaseAddress + FvbMapEntry->Length * LbaIndex))) {\r
+          if ((FtwDevice->SpareAreaAddress >= (FvbBaseAddress + FvbMapEntry->Length * (LbaIndex - 1)))\r
+              && (FtwDevice->SpareAreaAddress < (FvbBaseAddress + FvbMapEntry->Length * LbaIndex))) {\r
             //\r
             // Get the NumberOfSpareBlock and BlockSize\r
             //\r
-            FtwDevice->FtwSpareLba        = LbaIndex - 1;\r
-            FtwDevice->BlockSize          = FvbMapEntry->Length;\r
+            FtwDevice->FtwSpareLba   = LbaIndex - 1;\r
+            FtwDevice->BlockSize     = FvbMapEntry->Length;\r
             FtwDevice->NumberOfSpareBlock = FtwDevice->SpareAreaLength / FtwDevice->BlockSize;\r
             //\r
             // Check the range of spare area to make sure that it's in FV range\r
             //\r
             if ((FtwDevice->FtwSpareLba + FtwDevice->NumberOfSpareBlock) > FvbMapEntry->NumBlocks) {\r
               DEBUG ((EFI_D_ERROR, "Ftw: Spare area is out of FV range\n"));\r
-              FreePool (FtwDevice);\r
-              return EFI_ABORTED;\r
+              ASSERT (FALSE);\r
+              return;\r
             }\r
             break;\r
           }\r
@@ -1032,6 +997,12 @@ InitializeFaultTolerantWrite (
     }\r
   }\r
 \r
+  if ((FtwDevice->FtwBackupFvb == NULL) || (FtwDevice->FtwFvBlock == NULL) ||\r
+    (FtwDevice->FtwWorkSpaceLba == (EFI_LBA) (-1)) || (FtwDevice->FtwSpareLba == (EFI_LBA) (-1))) {\r
+    return;\r
+  }\r
+\r
+  DEBUG ((EFI_D_INFO, "Ftw: Working and spare FVB is ready\n"));\r
   //\r
   // Calculate the start LBA of working block. Working block is an area which\r
   // contains working space in its last block and has the same size as spare\r
@@ -1039,21 +1010,8 @@ InitializeFaultTolerantWrite (
   // working space.\r
   //\r
   FtwDevice->FtwWorkBlockLba = FtwDevice->FtwWorkSpaceLba - FtwDevice->NumberOfSpareBlock + 1;\r
-  if ((INT64) (FtwDevice->FtwWorkBlockLba) < 0) {\r
-    DEBUG ((EFI_D_ERROR, "Ftw: The spare block range is too large than the working block range!\n"));\r
-    FreePool (FtwDevice);\r
-    return EFI_ABORTED;\r
-  }\r
+  ASSERT ((INT64) (FtwDevice->FtwWorkBlockLba) >= 0); \r
 \r
-  if ((FtwDevice->FtwFvBlock == NULL) ||\r
-      (FtwDevice->FtwBackupFvb == NULL) ||\r
-      (FtwDevice->FtwWorkSpaceLba == (EFI_LBA) (-1)) ||\r
-      (FtwDevice->FtwSpareLba == (EFI_LBA) (-1))\r
-      ) {\r
-    DEBUG ((EFI_D_ERROR, "Ftw: Working or spare FVB not ready\n"));\r
-    FreePool (FtwDevice);\r
-    return EFI_ABORTED;\r
-  }\r
   //\r
   // Initialize other parameters, and set WorkSpace as FTW_ERASED_BYTE.\r
   //\r
@@ -1067,9 +1025,7 @@ InitializeFaultTolerantWrite (
   // Refresh the working space data from working block\r
   //\r
   Status = WorkSpaceRefresh (FtwDevice);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Recovery;\r
-  }\r
+  ASSERT_EFI_ERROR (Status);\r
   //\r
   // If the working block workspace is not valid, try the spare block\r
   //\r
@@ -1079,15 +1035,14 @@ InitializeFaultTolerantWrite (
     //\r
     Length = FtwDevice->FtwWorkSpaceSize;\r
     Status = FtwDevice->FtwBackupFvb->Read (\r
-                                        FtwDevice->FtwBackupFvb,\r
-                                        FtwDevice->FtwSpareLba,\r
-                                        FtwDevice->FtwWorkSpaceBase,\r
-                                        &Length,\r
-                                        FtwDevice->FtwWorkSpace\r
-                                        );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Recovery;\r
-    }\r
+                    FtwDevice->FtwBackupFvb,\r
+                    FtwDevice->FtwSpareLba,\r
+                    FtwDevice->FtwWorkSpaceBase,\r
+                    &Length,\r
+                    FtwDevice->FtwWorkSpace\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
     //\r
     // If spare block is valid, then replace working block content.\r
     //\r
@@ -1099,9 +1054,7 @@ InitializeFaultTolerantWrite (
       // Refresh work space.\r
       //\r
       Status = WorkSpaceRefresh (FtwDevice);\r
-      if (EFI_ERROR (Status)) {\r
-        goto Recovery;\r
-      }\r
+      ASSERT_EFI_ERROR (Status);\r
     } else {\r
       DEBUG ((EFI_D_ERROR, "Ftw: Both are invalid, init workspace\n"));\r
       //\r
@@ -1117,20 +1070,17 @@ InitializeFaultTolerantWrite (
       // Initialize the work space\r
       //\r
       Status = FtwReclaimWorkSpace (FtwDevice, FALSE);\r
-      if (EFI_ERROR (Status)) {\r
-        goto Recovery;\r
-      }\r
+      ASSERT_EFI_ERROR (Status);\r
     }\r
   }\r
-\r
   //\r
   // If the FtwDevice->FtwLastWriteRecord is 1st record of write header &&\r
-  // (! SpareComplete)  THEN  call Abort().\r
+  // (! SpareComplete) THEN call Abort().\r
   //\r
   if ((FtwDevice->FtwLastWriteHeader->HeaderAllocated == FTW_VALID_STATE) &&\r
-      (FtwDevice->FtwLastWriteRecord->SpareComplete != FTW_VALID_STATE) &&\r
-      IsFirstRecordOfWrites (FtwDevice->FtwLastWriteHeader, FtwDevice->FtwLastWriteRecord)\r
-        ) {\r
+    (FtwDevice->FtwLastWriteRecord->SpareComplete != FTW_VALID_STATE) &&\r
+    IsFirstRecordOfWrites (FtwDevice->FtwLastWriteHeader, FtwDevice->FtwLastWriteRecord)\r
+    ) {\r
     DEBUG ((EFI_D_ERROR, "Ftw: Init.. find first record not SpareCompleted, abort()\n"));\r
     FtwAbort (&FtwDevice->FtwInstance);\r
   }\r
@@ -1139,9 +1089,9 @@ InitializeFaultTolerantWrite (
   // call Abort() to set the Header->Complete FLAG.\r
   //\r
   if ((FtwDevice->FtwLastWriteHeader->Complete != FTW_VALID_STATE) &&\r
-      (FtwDevice->FtwLastWriteRecord->DestinationComplete == FTW_VALID_STATE) &&\r
-      IsLastRecordOfWrites (FtwDevice->FtwLastWriteHeader, FtwDevice->FtwLastWriteRecord)\r
-        ) {\r
+    (FtwDevice->FtwLastWriteRecord->DestinationComplete == FTW_VALID_STATE) &&\r
+    IsLastRecordOfWrites (FtwDevice->FtwLastWriteHeader, FtwDevice->FtwLastWriteRecord)\r
+    ) {\r
     DEBUG ((EFI_D_ERROR, "Ftw: Init.. find last record completed but header not, abort()\n"));\r
     FtwAbort (&FtwDevice->FtwInstance);\r
   }\r
@@ -1154,29 +1104,22 @@ InitializeFaultTolerantWrite (
   if (FtwDevice->FtwWorkSpace[Offset] != FTW_ERASED_BYTE) {\r
     Offset += WRITE_TOTAL_SIZE (FtwHeader->NumberOfWrites, FtwHeader->PrivateDataSize);\r
   }\r
-\r
-  if (!IsErasedFlashBuffer (\r
-        FtwDevice->FtwWorkSpace + Offset,\r
-        FtwDevice->FtwWorkSpaceSize - Offset\r
-        )) {\r
+  \r
+  if (!IsErasedFlashBuffer (FtwDevice->FtwWorkSpace + Offset, FtwDevice->FtwWorkSpaceSize - Offset)) {\r
     Status = FtwReclaimWorkSpace (FtwDevice, TRUE);\r
-    if (EFI_ERROR (Status)) {\r
-      goto Recovery;\r
-    }\r
+    ASSERT_EFI_ERROR (Status);\r
   }\r
+\r
   //\r
   // Restart if it's boot block\r
   //\r
   if ((FtwDevice->FtwLastWriteHeader->Complete != FTW_VALID_STATE) &&\r
-      (FtwDevice->FtwLastWriteRecord->SpareComplete == FTW_VALID_STATE)\r
-      ) {\r
+    (FtwDevice->FtwLastWriteRecord->SpareComplete == FTW_VALID_STATE)\r
+    ) {\r
     if (FtwDevice->FtwLastWriteRecord->BootBlockUpdate == FTW_VALID_STATE) {\r
       Status = FlushSpareBlockToBootBlock (FtwDevice);\r
       DEBUG ((EFI_D_ERROR, "Ftw: Restart boot block update - %r\n", Status));\r
-      if (EFI_ERROR (Status)) {\r
-        goto Recovery;\r
-      }\r
-  \r
+      ASSERT_EFI_ERROR (Status);\r
       FtwAbort (&FtwDevice->FtwInstance);\r
     } else {\r
       //\r
@@ -1186,46 +1129,107 @@ InitializeFaultTolerantWrite (
       if (FvbHandle != NULL) {\r
         Status = FtwRestart (&FtwDevice->FtwInstance, FvbHandle);\r
         DEBUG ((EFI_D_ERROR, "FtwLite: Restart last write - %r\n", Status));\r
-        if (EFI_ERROR (Status)) {\r
-          goto Recovery;\r
-        }\r
+        ASSERT_EFI_ERROR (Status);\r
       }\r
       FtwAbort (&FtwDevice->FtwInstance);\r
     }\r
   }\r
-\r
   //\r
   // Hook the protocol API\r
   //\r
-  FtwDevice->FtwInstance.GetMaxBlockSize  = FtwGetMaxBlockSize;\r
-  FtwDevice->FtwInstance.Allocate         = FtwAllocate;\r
-  FtwDevice->FtwInstance.Write            = FtwWrite;\r
-  FtwDevice->FtwInstance.Restart          = FtwRestart;\r
-  FtwDevice->FtwInstance.Abort            = FtwAbort;\r
-  FtwDevice->FtwInstance.GetLastWrite     = FtwGetLastWrite;\r
-\r
+  FtwDevice->FtwInstance.GetMaxBlockSize = FtwGetMaxBlockSize;\r
+  FtwDevice->FtwInstance.Allocate        = FtwAllocate;\r
+  FtwDevice->FtwInstance.Write           = FtwWrite;\r
+  FtwDevice->FtwInstance.Restart         = FtwRestart;\r
+  FtwDevice->FtwInstance.Abort           = FtwAbort;\r
+  FtwDevice->FtwInstance.GetLastWrite    = FtwGetLastWrite;\r
+  \r
   //\r
   // Install protocol interface\r
   //\r
   Status = gBS->InstallProtocolInterface (\r
-                  &FtwDevice->Handle,\r
-                  &gEfiFaultTolerantWriteProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &FtwDevice->FtwInstance\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    goto Recovery;\r
+            &FtwDevice->Handle,\r
+            &gEfiFaultTolerantWriteProtocolGuid,\r
+            EFI_NATIVE_INTERFACE,\r
+            &FtwDevice->FtwInstance\r
+            );\r
+\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  //\r
+  // Close the notify event to avoid install FaultTolerantWriteProtocol again.\r
+  //\r
+  Status = gBS->CloseEvent (Event);    \r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  return;\r
+}\r
+\r
+/**\r
+  This function is the entry point of the Fault Tolerant Write driver.\r
+\r
+  @param ImageHandle     A handle for the image that is initializing this driver\r
+  @param SystemTable     A pointer to the EFI system table\r
+\r
+  @return EFI_SUCCESS           FTW has finished the initialization\r
+  @retval EFI_NOT_FOUND         Locate FVB protocol error\r
+  @retval EFI_OUT_OF_RESOURCES  Allocate memory error\r
+  @retval EFI_VOLUME_CORRUPTED  Firmware volume is error\r
+  @retval EFI_ABORTED           FTW initialization error\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeFaultTolerantWrite (\r
+  IN EFI_HANDLE         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE   *SystemTable\r
+  )\r
+{\r
+  EFI_FTW_DEVICE                      *FtwDevice;\r
+\r
+  //\r
+  // Allocate Private data of this driver,\r
+  // INCLUDING THE FtwWorkSpace[FTW_WORK_SPACE_SIZE].\r
+  //\r
+  FtwDevice = NULL;\r
+  FtwDevice = AllocateZeroPool (sizeof (EFI_FTW_DEVICE) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize));\r
+  if (FtwDevice == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  ZeroMem (FtwDevice, sizeof (EFI_FTW_DEVICE));\r
+  FtwDevice->Signature = FTW_DEVICE_SIGNATURE;\r
 \r
-Recovery:\r
+  //\r
+  // Initialize other parameters, and set WorkSpace as FTW_ERASED_BYTE.\r
+  //\r
+\r
+  FtwDevice->WorkSpaceAddress = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageFtwWorkingBase);\r
+  FtwDevice->WorkSpaceLength  = (UINTN) PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
+\r
+  FtwDevice->SpareAreaAddress = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashNvStorageFtwSpareBase);\r
+  FtwDevice->SpareAreaLength  = (UINTN) PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
 \r
-  if (FtwDevice != NULL) {\r
+  if ((FtwDevice->WorkSpaceLength == 0) || (FtwDevice->SpareAreaLength == 0)) {\r
+    DEBUG ((EFI_D_ERROR, "Ftw: Workspace or Spare block does not exist!\n"));\r
     FreePool (FtwDevice);\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
+  FtwDevice->FtwFvBlock       = NULL;\r
+  FtwDevice->FtwBackupFvb     = NULL;\r
+  FtwDevice->FtwWorkSpaceLba  = (EFI_LBA) (-1);\r
+  FtwDevice->FtwSpareLba      = (EFI_LBA) (-1);\r
 \r
-  DEBUG ((EFI_D_ERROR, "Ftw: Severe Error occurs, need to recovery\n"));\r
+  //\r
+  // Register FvbNotificationEvent () notify function.\r
+  // \r
+  EfiCreateProtocolNotifyEvent (\r
+    &gEfiFirmwareVolumeBlockProtocolGuid,\r
+    TPL_CALLBACK,\r
+    FvbNotificationEvent,\r
+    (VOID *)FtwDevice,\r
+    &mFvbRegistration\r
+    );\r
 \r
-  return EFI_VOLUME_CORRUPTED;\r
+  return EFI_SUCCESS;\r
 }\r
index 3cc6572e55d5cb3e064ea0902f7009816a36912d..cd0c6379362921ff6a6fa764c0794d16554e3896 100644 (file)
@@ -26,6 +26,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include <Library/PcdLib.h>\r
 #include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
 #include <Library/UefiDriverEntryPoint.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
index cf526e701df459dbc49be7fb6b00826991a15fad..720c5919902a77f43d10bc35cd44609f1115eff1 100644 (file)
@@ -44,6 +44,7 @@
   BaseMemoryLib\r
   UefiDriverEntryPoint\r
   DebugLib\r
+  UefiLib\r
 \r
 [Guids]\r
   gEfiSystemNvDataFvGuid                        ## CONSUMES ## FV Signature of Working Space Header\r
@@ -63,5 +64,5 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
 \r
 [Depex]\r
-  gEfiFirmwareVolumeBlockProtocolGuid AND gEfiAlternateFvBlockGuid  ## gEfiAlternateFvBlockGuid specifies FVB protocol with read, write/erase flash access.\r
+  gEfiFirmwareVolumeBlockProtocolGuid\r
 \r
index 8d1b7e3c28818a7a44abf26e4fd149ed6d3e57dd..350672448fa4ed55796fdb4e246528b3848a26c5 100644 (file)
@@ -29,7 +29,6 @@ Revision History
 //\r
 #include <Guid/EventGroup.h>\r
 #include <Protocol/FirmwareVolumeBlock.h>\r
-#include <Guid/AlternateFvBlock.h>\r
 #include <Protocol/DevicePath.h>\r
 //\r
 // The Library classes this module consumes\r
@@ -1390,15 +1389,6 @@ Returns:
       ASSERT (FALSE);\r
     }\r
 \r
-    Status = gBS->InstallMultipleProtocolInterfaces (\r
-                    &FwbHandle,\r
-                    &gEfiAlternateFvBlockGuid,\r
-                    NULL,\r
-                    NULL\r
-                    );\r
-\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
     FwhInstance = (EFI_FW_VOL_INSTANCE *)\r
       (\r
         (UINTN) ((UINT8 *) FwhInstance) + FwVolHeader->HeaderLength +\r
index e05e205aae9639e0c0cbad1e70487aa7769febea..aee8201dfe23ab5cf25ca28826f1004e93e7f406 100644 (file)
@@ -32,7 +32,6 @@ Abstract:
 #include <Guid/FirmwareFileSystem2.h>\r
 #include <Guid/SystemNvDataGuid.h>\r
 #include <Protocol/FirmwareVolumeBlock.h>\r
-#include <Guid/AlternateFvBlock.h>\r
 #include <Protocol/DevicePath.h>\r
 //\r
 // The Library classes this module consumes\r
index a36a9a3fc0757178074f03d8f46ee78d852aaf7e..29825008410615925fdfe78c6d0cf0645d28f27c 100644 (file)
@@ -60,7 +60,6 @@
 \r
 [Guids]\r
   gEfiEventVirtualAddressChangeGuid             # ALWAYS_CONSUMED  Create Event: EVENT_GROUP_GUID\r
-  gEfiAlternateFvBlockGuid                      # ALWAYS_CONSUME\r
 \r
 [Protocols]\r
   gEfiFirmwareVolumeBlockProtocolGuid           # PROTOCOL ALWAYS_PRODUCED\r
@@ -85,4 +84,4 @@
 \r
 [depex]\r
   TRUE\r
-  
\ No newline at end of file
+  \r
index f3a28988020a6dd7c02f0e50704f7a1c639a12a0..132442b6b9981c012b6e47fa09cba1421c257c55 100644 (file)
@@ -22,7 +22,6 @@ Revision History
 #include "PiDxe.h"\r
 #include <Guid/EventGroup.h>\r
 #include <Protocol/FirmwareVolumeBlock.h>\r
-#include <Guid/AlternateFvBlock.h>\r
 #include <Protocol/DevicePath.h>\r
 \r
 #include <Library/UefiLib.h>\r
@@ -1355,15 +1354,6 @@ Returns:
       ASSERT (FALSE);\r
     }\r
 \r
-    Status = gBS->InstallMultipleProtocolInterfaces (\r
-                    &FwbHandle,\r
-                    &gEfiAlternateFvBlockGuid,\r
-                    NULL,\r
-                    NULL\r
-                    );\r
-\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
     FwhInstance = (EFI_FW_VOL_INSTANCE *)\r
       (\r
         (UINTN) ((UINT8 *) FwhInstance) + FwVolHeader->HeaderLength +\r
index b7a5a302711ad5daec6940ae5a8637805fbccc52..d73f809273ff2eb8c4d8994221b0466ca7253155 100644 (file)
@@ -22,7 +22,6 @@ Abstract:
 #include "PiDxe.h"\r
 #include <Guid/EventGroup.h>\r
 #include <Protocol/FirmwareVolumeBlock.h>\r
-#include <Guid/AlternateFvBlock.h>\r
 #include <Protocol/DevicePath.h>\r
 \r
 #include <Library/UefiLib.h>\r
index 58aee9a06b3a49af4e456baf7af9edb09fe7eca6..05fc4270912137471d8c024820a5a8cc3a3576ce 100644 (file)
@@ -59,8 +59,6 @@
 \r
 [Guids]\r
   gEfiEventVirtualAddressChangeGuid             # ALWAYS_CONSUMED  Create Event: EVENT_GROUP_GUID\r
-  gEfiAlternateFvBlockGuid                      # ALWAYS_PRODUCED\r
-\r
 \r
 [Protocols]\r
   gEfiFirmwareVolumeBlockProtocolGuid           # PROTOCOL ALWAYS_PRODUCED\r