mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-03 21:17:23 +01:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3425 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			690 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			690 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*++
 | 
						|
 | 
						|
Copyright (c) 2006, Intel Corporation                                                         
 | 
						|
All rights reserved. This program and the accompanying materials                          
 | 
						|
are licensed and made available under the terms and conditions of the BSD License         
 | 
						|
which accompanies this distribution.  The full text of the license may be found at        
 | 
						|
http://opensource.org/licenses/bsd-license.php                                            
 | 
						|
                                                                                          
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 
 | 
						|
 | 
						|
 | 
						|
Module Name:
 | 
						|
 | 
						|
  FtwLite.h
 | 
						|
 | 
						|
Abstract:
 | 
						|
 | 
						|
  This is a simple fault tolerant write driver, based on PlatformFd library.
 | 
						|
  And it only supports write BufferSize <= SpareAreaLength.
 | 
						|
 | 
						|
  This boot service only protocol provides fault tolerant write capability for 
 | 
						|
  block devices.  The protocol has internal non-volatile intermediate storage 
 | 
						|
  of the data and private information. It should be able to recover 
 | 
						|
  automatically from a critical fault, such as power failure. 
 | 
						|
 | 
						|
--*/
 | 
						|
 | 
						|
#ifndef _EFI_FAULT_TOLERANT_WRITE_LITE_H_
 | 
						|
#define _EFI_FAULT_TOLERANT_WRITE_LITE_H_
 | 
						|
 | 
						|
 | 
						|
#include <PiDxe.h>
 | 
						|
 | 
						|
#include <Protocol/PciRootBridgeIo.h>
 | 
						|
#include <Guid/SystemNvDataGuid.h>
 | 
						|
#include <Protocol/FaultTolerantWriteLite.h>
 | 
						|
#include <Protocol/FirmwareVolumeBlock.h>
 | 
						|
 | 
						|
#include <Library/PcdLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/UefiDriverEntryPoint.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
 | 
						|
#include <WorkingBlockHeader.h>
 | 
						|
 | 
						|
#define EFI_D_FTW_LITE  EFI_D_ERROR
 | 
						|
#define EFI_D_FTW_INFO  EFI_D_INFO
 | 
						|
 | 
						|
//
 | 
						|
// Flash erase polarity is 1
 | 
						|
//
 | 
						|
#define FTW_ERASE_POLARITY  1
 | 
						|
 | 
						|
#define FTW_VALID_STATE     0
 | 
						|
#define FTW_INVALID_STATE   1
 | 
						|
 | 
						|
#define FTW_ERASED_BYTE     ((UINT8) (255))
 | 
						|
#define FTW_POLARITY_REVERT ((UINT8) (255))
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8         WriteAllocated : 1;
 | 
						|
  UINT8         SpareCompleted : 1;
 | 
						|
  UINT8         WriteCompleted : 1;
 | 
						|
  UINT8         Reserved : 5;
 | 
						|
#define WRITE_ALLOCATED 0x1
 | 
						|
#define SPARE_COMPLETED 0x2
 | 
						|
#define WRITE_COMPLETED 0x4
 | 
						|
 | 
						|
  EFI_DEV_PATH  DevPath;
 | 
						|
  EFI_LBA       Lba;
 | 
						|
  UINTN         Offset;
 | 
						|
  UINTN         NumBytes;
 | 
						|
  //
 | 
						|
  // UINTN           SpareAreaOffset;
 | 
						|
  //
 | 
						|
} EFI_FTW_LITE_RECORD;
 | 
						|
 | 
						|
#define FTW_LITE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('F', 'T', 'W', 'L')
 | 
						|
 | 
						|
//
 | 
						|
// MACRO for Block size.
 | 
						|
// Flash Erasing will do in block granularity.
 | 
						|
//
 | 
						|
#ifdef FV_BLOCK_SIZE
 | 
						|
#define FTW_BLOCK_SIZE  FV_BLOCK_SIZE
 | 
						|
#else
 | 
						|
#define FV_BLOCK_SIZE   0x10000
 | 
						|
#define FTW_BLOCK_SIZE  FV_BLOCK_SIZE
 | 
						|
#endif
 | 
						|
//
 | 
						|
// MACRO for FTW WORK SPACE Base & Size
 | 
						|
//
 | 
						|
#ifdef EFI_FTW_WORKING_OFFSET
 | 
						|
#define FTW_WORK_SPACE_BASE EFI_FTW_WORKING_OFFSET
 | 
						|
#else
 | 
						|
#define FTW_WORK_SPACE_BASE 0x00E000
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef EFI_FTW_WORKING_LENGTH
 | 
						|
#define FTW_WORK_SPACE_SIZE EFI_FTW_WORKING_LENGTH
 | 
						|
#else
 | 
						|
#define FTW_WORK_SPACE_SIZE 0x002000
 | 
						|
#endif
 | 
						|
//
 | 
						|
// MACRO for FTW header and record
 | 
						|
//
 | 
						|
#define FTW_WORKING_QUEUE_SIZE  (FTW_WORK_SPACE_SIZE - sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER))
 | 
						|
#define FTW_LITE_RECORD_SIZE    (sizeof (EFI_FTW_LITE_RECORD))
 | 
						|
#define WRITE_TOTAL_SIZE        FTW_LITE_RECORD_SIZE
 | 
						|
 | 
						|
//
 | 
						|
// EFI Fault tolerant protocol private data structure
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINTN                                   Signature;
 | 
						|
  EFI_HANDLE                              Handle;
 | 
						|
  EFI_FTW_LITE_PROTOCOL                   FtwLiteInstance;
 | 
						|
  EFI_PHYSICAL_ADDRESS                    WorkSpaceAddress;
 | 
						|
  UINTN                                   WorkSpaceLength;
 | 
						|
  EFI_PHYSICAL_ADDRESS                    SpareAreaAddress;
 | 
						|
  UINTN                                   SpareAreaLength;
 | 
						|
  UINTN                                   NumberOfSpareBlock; // Number of the blocks in spare block
 | 
						|
  UINTN                                   SizeOfSpareBlock;   // Block size in bytes of the blocks in spare block
 | 
						|
  EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *FtwWorkSpaceHeader;
 | 
						|
  EFI_FTW_LITE_RECORD                     *FtwLastRecord;
 | 
						|
  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL      *FtwFvBlock;        // FVB of working block
 | 
						|
  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL      *FtwBackupFvb;      // FVB of spare block
 | 
						|
  EFI_LBA                                 FtwSpareLba;
 | 
						|
  EFI_LBA                                 FtwWorkBlockLba;    // Start LBA of working block
 | 
						|
  EFI_LBA                                 FtwWorkSpaceLba;    // Start LBA of working space
 | 
						|
  UINTN                                   FtwWorkSpaceBase;   // Offset from LBA start addr
 | 
						|
  UINTN                                   FtwWorkSpaceSize;
 | 
						|
  UINT8                                   *FtwWorkSpace;
 | 
						|
  //
 | 
						|
  // Following a buffer of FtwWorkSpace[FTW_WORK_SPACE_SIZE],
 | 
						|
  // Allocated with EFI_FTW_LITE_DEVICE.
 | 
						|
  //
 | 
						|
} EFI_FTW_LITE_DEVICE;
 | 
						|
 | 
						|
#define FTW_LITE_CONTEXT_FROM_THIS(a) CR (a, EFI_FTW_LITE_DEVICE, FtwLiteInstance, FTW_LITE_DEVICE_SIGNATURE)
 | 
						|
 | 
						|
//
 | 
						|
// Driver entry point
 | 
						|
//
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
InitializeFtwLite (
 | 
						|
  IN EFI_HANDLE                 ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE           *SystemTable
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    This function is the entry point of the Fault Tolerant Write driver.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    ImageHandle   - EFI_HANDLE: A handle for the image that is initializing 
 | 
						|
                    this driver
 | 
						|
    SystemTable   - EFI_SYSTEM_TABLE: A pointer to the EFI system table
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS           - FTW has finished the initialization
 | 
						|
    EFI_ABORTED           - FTW initialization error
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
//
 | 
						|
// Fault Tolerant Write Protocol API
 | 
						|
//
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
FtwLiteWrite (
 | 
						|
  IN EFI_FTW_LITE_PROTOCOL                 *This,
 | 
						|
  IN EFI_HANDLE                            FvbHandle,
 | 
						|
  IN EFI_LBA                               Lba,
 | 
						|
  IN UINTN                                 Offset,
 | 
						|
  IN UINTN                                 *NumBytes,
 | 
						|
  IN VOID                                  *Buffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Starts a target block update. This function will record data about write 
 | 
						|
    in fault tolerant storage and will complete the write in a recoverable 
 | 
						|
    manner, ensuring at all times that either the original contents or 
 | 
						|
    the modified contents are available.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    This             - Calling context
 | 
						|
    FvbHandle        - The handle of FVB protocol that provides services for 
 | 
						|
                       reading, writing, and erasing the target block.
 | 
						|
    Lba              - The logical block address of the target block.  
 | 
						|
    Offset           - The offset within the target block to place the data.
 | 
						|
    NumBytes         - The number of bytes to write to the target block.
 | 
						|
    Buffer           - The data to write.
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS          - The function completed successfully
 | 
						|
    EFI_BAD_BUFFER_SIZE  - The write would span a target block, which is not 
 | 
						|
                           a valid action.
 | 
						|
    EFI_ACCESS_DENIED    - No writes have been allocated.
 | 
						|
    EFI_NOT_FOUND        - Cannot find FVB by handle.
 | 
						|
    EFI_OUT_OF_RESOURCES - Cannot allocate memory.
 | 
						|
    EFI_ABORTED          - The function could not complete successfully.
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
//
 | 
						|
// Internal functions
 | 
						|
//
 | 
						|
EFI_STATUS
 | 
						|
FtwRestart (
 | 
						|
  IN EFI_FTW_LITE_DEVICE    *FtwLiteDevice
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Restarts a previously interrupted write. The caller must provide the 
 | 
						|
    block protocol needed to complete the interrupted write.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice       - The private data of FTW_LITE driver
 | 
						|
    FvbHandle           - The handle of FVB protocol that provides services for 
 | 
						|
                          reading, writing, and erasing the target block.
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS         - The function completed successfully
 | 
						|
    EFI_ACCESS_DENIED   - No pending writes exist
 | 
						|
    EFI_NOT_FOUND       - FVB protocol not found by the handle
 | 
						|
    EFI_ABORTED         - The function could not complete successfully
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwAbort (
 | 
						|
  IN EFI_FTW_LITE_DEVICE    *FtwLiteDevice
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Aborts all previous allocated writes.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice    - The private data of FTW_LITE driver
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS      - The function completed successfully
 | 
						|
    EFI_ABORTED      - The function could not complete successfully.
 | 
						|
    EFI_NOT_FOUND    - No allocated writes exist.
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwWriteRecord (
 | 
						|
  IN EFI_FTW_LITE_DEVICE                   *FtwLiteDevice,
 | 
						|
  IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *Fvb
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Write a record with fault tolerant mannaer.
 | 
						|
    Since the content has already backuped in spare block, the write is 
 | 
						|
    guaranteed to be completed with fault tolerant manner.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice       - The private data of FTW_LITE driver
 | 
						|
    Fvb                 - The FVB protocol that provides services for 
 | 
						|
                          reading, writing, and erasing the target block.
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS         - The function completed successfully
 | 
						|
    EFI_ABORTED         - The function could not complete successfully
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwEraseBlock (
 | 
						|
  IN EFI_FTW_LITE_DEVICE              *FtwLiteDevice,
 | 
						|
  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,
 | 
						|
  EFI_LBA                             Lba
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    To Erase one block. The size is FTW_BLOCK_SIZE
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice - Calling context
 | 
						|
    FvBlock       - FVB Protocol interface
 | 
						|
    Lba           - Lba of the firmware block
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS   - Block LBA is Erased successfully
 | 
						|
    Others        - Error occurs
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwEraseSpareBlock (
 | 
						|
  IN EFI_FTW_LITE_DEVICE   *FtwLiteDevice
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Erase spare block.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  FtwLiteDevice - Calling context
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Status code
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwGetFvbByHandle (
 | 
						|
  IN EFI_HANDLE                           FvBlockHandle,
 | 
						|
  OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  **FvBlock
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Retrive the proper FVB protocol interface by HANDLE.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FvBlockHandle       - The handle of FVB protocol that provides services for 
 | 
						|
                          reading, writing, and erasing the target block.
 | 
						|
    FvBlock             - The interface of FVB protocol
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS         - The function completed successfully
 | 
						|
    EFI_ABORTED         - The function could not complete successfully
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
GetFvbByAddress (
 | 
						|
  IN  EFI_PHYSICAL_ADDRESS               Address,
 | 
						|
  OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL **FvBlock
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get firmware block by address.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Address - Address specified the block
 | 
						|
  FvBlock - The block caller wanted
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Status code
 | 
						|
 | 
						|
  EFI_NOT_FOUND - Block not found
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
BOOLEAN
 | 
						|
IsInWorkingBlock (
 | 
						|
  EFI_FTW_LITE_DEVICE                 *FtwLiteDevice,
 | 
						|
  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,
 | 
						|
  EFI_LBA                             Lba
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Is it in working block?
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  FtwLiteDevice - Calling context
 | 
						|
  FvBlock       - Fvb protocol instance
 | 
						|
  Lba           - The block specified
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  In working block or not
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
BOOLEAN
 | 
						|
IsBootBlock (
 | 
						|
  EFI_FTW_LITE_DEVICE                 *FtwLiteDevice,
 | 
						|
  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,
 | 
						|
  EFI_LBA                             Lba
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Check whether the block is a boot block.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  FtwLiteDevice - Calling context
 | 
						|
  FvBlock       - Fvb protocol instance
 | 
						|
  Lba           - Lba value
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Is a boot block or not
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FlushSpareBlockToTargetBlock (
 | 
						|
  EFI_FTW_LITE_DEVICE                 *FtwLiteDevice,
 | 
						|
  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,
 | 
						|
  EFI_LBA                             Lba
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Copy the content of spare block to a target block. Size is FTW_BLOCK_SIZE.
 | 
						|
    Spare block is accessed by FTW backup FVB protocol interface. LBA is 
 | 
						|
    FtwLiteDevice->FtwSpareLba.
 | 
						|
    Target block is accessed by FvBlock protocol interface. LBA is Lba.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice  - The private data of FTW_LITE driver
 | 
						|
    FvBlock        - FVB Protocol interface to access target block
 | 
						|
    Lba            - Lba of the target block
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS              - Spare block content is copied to target block
 | 
						|
    EFI_INVALID_PARAMETER    - Input parameter error
 | 
						|
    EFI_OUT_OF_RESOURCES     - Allocate memory error
 | 
						|
    EFI_ABORTED              - The function could not complete successfully
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FlushSpareBlockToWorkingBlock (
 | 
						|
  EFI_FTW_LITE_DEVICE                 *FtwLiteDevice
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Copy the content of spare block to working block. Size is FTW_BLOCK_SIZE.
 | 
						|
    Spare block is accessed by FTW backup FVB protocol interface. LBA is 
 | 
						|
    FtwLiteDevice->FtwSpareLba.
 | 
						|
    Working block is accessed by FTW working FVB protocol interface. LBA is 
 | 
						|
    FtwLiteDevice->FtwWorkBlockLba.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice  - The private data of FTW_LITE driver
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS              - Spare block content is copied to target block
 | 
						|
    EFI_OUT_OF_RESOURCES     - Allocate memory error
 | 
						|
    EFI_ABORTED              - The function could not complete successfully
 | 
						|
 | 
						|
Notes:
 | 
						|
    Since the working block header is important when FTW initializes, the 
 | 
						|
    state of the operation should be handled carefully. The Crc value is 
 | 
						|
    calculated without STATE element. 
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FlushSpareBlockToBootBlock (
 | 
						|
  EFI_FTW_LITE_DEVICE                 *FtwLiteDevice
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Copy the content of spare block to a boot block. Size is FTW_BLOCK_SIZE.
 | 
						|
    Spare block is accessed by FTW backup FVB protocol interface. LBA is 
 | 
						|
    FtwLiteDevice->FtwSpareLba.
 | 
						|
    Boot block is accessed by BootFvb protocol interface. LBA is 0.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice  - The private data of FTW_LITE driver
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS              - Spare block content is copied to boot block
 | 
						|
    EFI_INVALID_PARAMETER    - Input parameter error
 | 
						|
    EFI_OUT_OF_RESOURCES     - Allocate memory error
 | 
						|
    EFI_ABORTED              - The function could not complete successfully
 | 
						|
 | 
						|
Notes:
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwUpdateFvState (
 | 
						|
  IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *FvBlock,
 | 
						|
  IN EFI_LBA                             Lba,
 | 
						|
  IN UINTN                               Offset,
 | 
						|
  IN UINT8                               NewBit
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Update a bit of state on a block device. The location of the bit is 
 | 
						|
    calculated by the (Lba, Offset, bit). Here bit is determined by the 
 | 
						|
    the name of a certain bit.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FvBlock    - FVB Protocol interface to access SrcBlock and DestBlock
 | 
						|
    Lba        - Lba of a block
 | 
						|
    Offset     - Offset on the Lba
 | 
						|
    NewBit     - New value that will override the old value if it can be change
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS   - A state bit has been updated successfully
 | 
						|
    Others        - Access block device error.
 | 
						|
 | 
						|
Notes:
 | 
						|
    Assume all bits of State are inside the same BYTE. 
 | 
						|
 | 
						|
    EFI_ABORTED   - Read block fail
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwGetLastRecord (
 | 
						|
  IN  EFI_FTW_LITE_DEVICE  *FtwLiteDevice,
 | 
						|
  OUT EFI_FTW_LITE_RECORD  **FtwLastRecord
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Get the last Write record pointer. 
 | 
						|
    The last record is the record whose 'complete' state hasn't been set.
 | 
						|
    After all, this header may be a EMPTY header entry for next Allocate. 
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice   - Private data of this driver
 | 
						|
    FtwLastRecord   - Pointer to retrieve the last write record
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS     - Get the last write record successfully
 | 
						|
    EFI_ABORTED     - The FTW work space is damaged
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
BOOLEAN
 | 
						|
IsErasedFlashBuffer (
 | 
						|
  IN BOOLEAN         Polarity,
 | 
						|
  IN UINT8           *Buffer,
 | 
						|
  IN UINTN           BufferSize
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Check whether a flash buffer is erased.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Polarity    - All 1 or all 0
 | 
						|
  Buffer      - Buffer to check
 | 
						|
  BufferSize  - Size of the buffer
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Erased or not.
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
InitWorkSpaceHeader (
 | 
						|
  IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Initialize a work space when there is no work space.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    WorkingHeader - Pointer of working block header 
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS   - The function completed successfully
 | 
						|
    EFI_ABORTED   - The function could not complete successfully.
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
WorkSpaceRefresh (
 | 
						|
  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Read from working block to refresh the work space in memory.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice     - Point to private data of FTW driver
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS   - The function completed successfully
 | 
						|
    EFI_ABORTED   - The function could not complete successfully.
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
BOOLEAN
 | 
						|
IsValidWorkSpace (
 | 
						|
  IN EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingHeader
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Check to see if it is a valid work space.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    WorkingHeader - Pointer of working block header 
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS   - The function completed successfully
 | 
						|
    EFI_ABORTED   - The function could not complete successfully.
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CleanupWorkSpace (
 | 
						|
  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice,
 | 
						|
  IN OUT UINT8            *BlockBuffer,
 | 
						|
  IN UINTN                BufferSize
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Reclaim the work space. Get rid of all the completed write records
 | 
						|
    and write records in the Fault Tolerant work space.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice   - Point to private data of FTW driver
 | 
						|
    FtwSpaceBuffer  - Buffer to contain the reclaimed clean data
 | 
						|
    BufferSize      - Size of the FtwSpaceBuffer
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS           - The function completed successfully
 | 
						|
    EFI_BUFFER_TOO_SMALL  - The FtwSpaceBuffer is too small
 | 
						|
    EFI_ABORTED           - The function could not complete successfully.
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
FtwReclaimWorkSpace (
 | 
						|
  IN EFI_FTW_LITE_DEVICE  *FtwLiteDevice
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
    Reclaim the work space on the working block.
 | 
						|
 | 
						|
Arguments:
 | 
						|
    FtwLiteDevice     - Point to private data of FTW driver
 | 
						|
 | 
						|
Returns:
 | 
						|
    EFI_SUCCESS           - The function completed successfully
 | 
						|
    EFI_OUT_OF_RESOURCES  - Allocate memory error
 | 
						|
    EFI_ABORTED           - The function could not complete successfully
 | 
						|
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
#endif
 |