]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Universal / FaultTolerantWriteDxe / FaultTolerantWrite.h
index 78c65f2af6cbfef5e74a566976b26f8080ff5b1c..844cf3bee04db2214d1c1f8dd93e9b7417e4aa91 100644 (file)
@@ -1,16 +1,16 @@
 /** @file\r
 \r
   The internal header file includes the common header files, defines\r
-  internal structure and functions used by FtwLite module.\r
+  internal structure and functions used by Ftw module.\r
 \r
-Copyright (c) 2006 - 2013, 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
+Copyright (c) 2006 - 2018, 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
@@ -32,6 +32,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
 \r
 //\r
 // Flash erase polarity is 1\r
@@ -49,6 +50,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define SPARE_COMPLETED   0x2\r
 #define DEST_COMPLETED    0x4\r
 \r
+#define FTW_BLOCKS(Length, BlockSize) ((UINTN) ((Length) / (BlockSize) + (((Length) & ((BlockSize) - 1)) ? 1 : 0)))\r
 \r
 #define FTW_DEVICE_SIGNATURE  SIGNATURE_32 ('F', 'T', 'W', 'D')\r
 \r
@@ -62,9 +64,11 @@ typedef struct {
   EFI_PHYSICAL_ADDRESS                    WorkSpaceAddress;   // Base address of working space range in flash.\r
   EFI_PHYSICAL_ADDRESS                    SpareAreaAddress;   // Base address of spare range in flash.\r
   UINTN                                   WorkSpaceLength;    // Size of working space range in flash.\r
+  UINTN                                   NumberOfWorkSpaceBlock; // Number of the blocks in work block for work space.\r
+  UINTN                                   WorkBlockSize;      // Block size in bytes of the work blocks in flash\r
   UINTN                                   SpareAreaLength;    // Size of spare range in flash.\r
   UINTN                                   NumberOfSpareBlock; // Number of the blocks in spare block.\r
-  UINTN                                   BlockSize;          // Block size in bytes of the blocks in flash\r
+  UINTN                                   SpareBlockSize;     // Block size in bytes of the spare blocks in flash\r
   EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *FtwWorkSpaceHeader;// Pointer to Working Space Header in memory buffer\r
   EFI_FAULT_TOLERANT_WRITE_HEADER         *FtwLastWriteHeader;// Pointer to last record header in memory buffer\r
   EFI_FAULT_TOLERANT_WRITE_RECORD         *FtwLastWriteRecord;// Pointer to last record in memory buffer\r
@@ -72,10 +76,13 @@ typedef struct {
   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL      *FtwBackupFvb;      // FVB of spare block\r
   EFI_LBA                                 FtwSpareLba;        // Start LBA of spare block\r
   EFI_LBA                                 FtwWorkBlockLba;    // Start LBA of working block that contains working space in its last block.\r
+  UINTN                                   NumberOfWorkBlock;  // Number of the blocks in work block.\r
   EFI_LBA                                 FtwWorkSpaceLba;    // Start LBA of working space\r
   UINTN                                   FtwWorkSpaceBase;   // Offset into the FtwWorkSpaceLba block.\r
   UINTN                                   FtwWorkSpaceSize;   // Size of working space range that stores write record.\r
-  UINT8                                   *FtwWorkSpace;      // Point to Work Space in memory buffer \r
+  EFI_LBA                                 FtwWorkSpaceLbaInSpare; // Start LBA of working space in spare block.\r
+  UINTN                                   FtwWorkSpaceBaseInSpare;// Offset into the FtwWorkSpaceLbaInSpare block.\r
+  UINT8                                   *FtwWorkSpace;      // Point to Work Space in memory buffer\r
   //\r
   // Following a buffer of FtwWorkSpace[FTW_WORK_SPACE_SIZE],\r
   // Allocated with EFI_FTW_DEVICE.\r
@@ -176,11 +183,11 @@ FtwAllocate (
                          reading, writing, and erasing the target block.\r
   @param Buffer          The data to write.\r
 \r
-  @retval EFI_SUCCESS          The function completed successfully \r
-  @retval EFI_ABORTED          The function could not complete successfully. \r
-  @retval EFI_BAD_BUFFER_SIZE  The input data can't fit within the spare block. \r
+  @retval EFI_SUCCESS          The function completed successfully\r
+  @retval EFI_ABORTED          The function could not complete successfully.\r
+  @retval EFI_BAD_BUFFER_SIZE  The input data can't fit within the spare block.\r
                                Offset + *NumBytes > SpareAreaLength.\r
-  @retval EFI_ACCESS_DENIED    No writes have been allocated. \r
+  @retval EFI_ACCESS_DENIED    No writes have been allocated.\r
   @retval EFI_OUT_OF_RESOURCES Cannot allocate enough memory resource.\r
   @retval EFI_NOT_FOUND        Cannot find FVB protocol by handle.\r
 \r
@@ -283,7 +290,7 @@ FtwGetLastWrite (
                                 partially erased.\r
   @retval EFI_INVALID_PARAMETER One or more of the LBAs listed\r
                                 in the variable argument list do\r
-                                not exist in the firmware volume.  \r
+                                not exist in the firmware volume.\r
 \r
 \r
 **/\r
@@ -293,7 +300,7 @@ FtwEraseSpareBlock (
   );\r
 \r
 /**\r
-  Retrive the proper FVB protocol interface by HANDLE.\r
+  Retrieve the proper FVB protocol interface by HANDLE.\r
 \r
 \r
   @param FvBlockHandle   The handle of FVB protocol that provides services for\r
@@ -334,7 +341,6 @@ IsWorkingBlock (
 \r
   @param FtwDevice       The private data of FTW driver\r
   @param FvBlock         Fvb protocol instance\r
-  @param Lba             The block specified\r
 \r
   @return A BOOLEAN value indicating in boot block or not.\r
 \r
@@ -342,19 +348,20 @@ IsWorkingBlock (
 BOOLEAN\r
 IsBootBlock (\r
   EFI_FTW_DEVICE                      *FtwDevice,\r
-  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,\r
-  EFI_LBA                             Lba\r
+  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock\r
   );\r
 \r
 /**\r
   Copy the content of spare block to a target block. Size is FTW_BLOCK_SIZE.\r
-  Spare block is accessed by FTW backup FVB protocol interface. LBA is 1.\r
-  Target block is accessed by FvbBlock protocol interface. LBA is Lba.\r
+  Spare block is accessed by FTW backup FVB protocol interface.\r
+  Target block is accessed by FvBlock protocol interface.\r
 \r
 \r
   @param FtwDevice       The private data of FTW driver\r
   @param FvBlock         FVB Protocol interface to access target block\r
   @param Lba             Lba of the target block\r
+  @param BlockSize       The size of the block\r
+  @param NumberOfBlocks  The number of consecutive blocks starting with Lba\r
 \r
   @retval  EFI_SUCCESS               Spare block content is copied to target block\r
   @retval  EFI_INVALID_PARAMETER     Input parameter error\r
@@ -366,7 +373,9 @@ EFI_STATUS
 FlushSpareBlockToTargetBlock (\r
   EFI_FTW_DEVICE                      *FtwDevice,\r
   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,\r
-  EFI_LBA                             Lba\r
+  EFI_LBA                             Lba,\r
+  UINTN                               BlockSize,\r
+  UINTN                               NumberOfBlocks\r
   );\r
 \r
 /**\r
@@ -394,8 +403,8 @@ FlushSpareBlockToWorkingBlock (
 \r
 /**\r
   Copy the content of spare block to a boot block. Size is FTW_BLOCK_SIZE.\r
-  Spare block is accessed by FTW working FVB protocol interface. LBA is 1.\r
-  Target block is accessed by FvbBlock protocol interface. LBA is Lba.\r
+  Spare block is accessed by FTW working FVB protocol interface.\r
+  Target block is accessed by FvBlock protocol interface.\r
 \r
   FTW will do extra work on boot block update.\r
   FTW should depend on a protocol of EFI_ADDRESS_RANGE_SWAP_PROTOCOL,\r
@@ -404,7 +413,7 @@ FlushSpareBlockToWorkingBlock (
   1. GetRangeLocation(), if the Range is inside the boot block, FTW know\r
   that boot block will be update. It shall add a FLAG in the working block.\r
   2. When spare block is ready,\r
-  3. SetSwapState(EFI_SWAPPED)\r
+  3. SetSwapState(SWAPPED)\r
   4. erasing boot block,\r
   5. programming boot block until the boot block is ok.\r
   6. SetSwapState(UNSWAPPED)\r
@@ -430,6 +439,7 @@ FlushSpareBlockToBootBlock (
 \r
 \r
   @param FvBlock         FVB Protocol interface to access SrcBlock and DestBlock\r
+  @param BlockSize       The size of the block\r
   @param Lba             Lba of a block\r
   @param Offset          Offset on the Lba\r
   @param NewBit          New value that will override the old value if it can be change\r
@@ -444,6 +454,7 @@ FlushSpareBlockToBootBlock (
 EFI_STATUS\r
 FtwUpdateFvState (\r
   IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,\r
+  IN UINTN                               BlockSize,\r
   IN EFI_LBA                             Lba,\r
   IN UINTN                               Offset,\r
   IN UINT8                               NewBit\r
@@ -613,7 +624,7 @@ FtwReclaimWorkSpace (
 \r
 /**\r
 \r
-  Get firmware block by address.\r
+  Get firmware volume block by address.\r
 \r
 \r
   @param Address         Address specified the block\r
@@ -630,7 +641,7 @@ GetFvbByAddress (
   );\r
 \r
 /**\r
-  Retrive the proper Swap Address Range protocol interface.\r
+  Retrieve the proper Swap Address Range protocol interface.\r
 \r
   @param[out] SarProtocol       The interface of SAR protocol\r
 \r
@@ -643,10 +654,10 @@ EFI_STATUS
 FtwGetSarProtocol (\r
   OUT VOID                                **SarProtocol\r
   );\r
-  \r
+\r
 /**\r
   Function returns an array of handles that support the FVB protocol\r
-  in a buffer allocated from pool. \r
+  in a buffer allocated from pool.\r
 \r
   @param[out]  NumberHandles    The number of handles returned in Buffer.\r
   @param[out]  Buffer           A pointer to the buffer to return the requested\r
@@ -678,7 +689,7 @@ GetFvbCountAndBuffer (
 **/\r
 EFI_STATUS\r
 InitFtwDevice (\r
-  OUT EFI_FTW_DEVICE               **FtwData \r
+  OUT EFI_FTW_DEVICE               **FtwData\r
   );\r
 \r
 \r
@@ -689,7 +700,7 @@ InitFtwDevice (
 \r
   @retval EFI_SUCCESS           Initialize the FTW protocol successfully.\r
   @retval EFI_NOT_FOUND         No proper FVB protocol was found.\r
-  \r
+\r
 **/\r
 EFI_STATUS\r
 InitFtwProtocol (\r
@@ -706,5 +717,53 @@ VOID
 InitializeLocalWorkSpaceHeader (\r
   VOID\r
   );\r
\r
+\r
+/**\r
+  Read work space data from work block or spare block.\r
+\r
+  @param FvBlock        FVB Protocol interface to access the block.\r
+  @param BlockSize      The size of the block.\r
+  @param Lba            Lba of the block.\r
+  @param Offset         The offset within the block.\r
+  @param Length         The number of bytes to read from the block.\r
+  @param Buffer         The data is read.\r
+\r
+  @retval EFI_SUCCESS   The function completed successfully.\r
+  @retval EFI_ABORTED   The function could not complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+ReadWorkSpaceData (\r
+  IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
+  IN UINTN                              BlockSize,\r
+  IN EFI_LBA                            Lba,\r
+  IN UINTN                              Offset,\r
+  IN UINTN                              Length,\r
+  OUT UINT8                             *Buffer\r
+  );\r
+\r
+/**\r
+  Write data to work block.\r
+\r
+  @param FvBlock        FVB Protocol interface to access the block.\r
+  @param BlockSize      The size of the block.\r
+  @param Lba            Lba of the block.\r
+  @param Offset         The offset within the block to place the data.\r
+  @param Length         The number of bytes to write to the block.\r
+  @param Buffer         The data to write.\r
+\r
+  @retval EFI_SUCCESS   The function completed successfully.\r
+  @retval EFI_ABORTED   The function could not complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+WriteWorkSpaceData (\r
+  IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
+  IN UINTN                              BlockSize,\r
+  IN EFI_LBA                            Lba,\r
+  IN UINTN                              Offset,\r
+  IN UINTN                              Length,\r
+  IN UINT8                              *Buffer\r
+  );\r
+\r
 #endif\r