This is a simple fault tolerant write driver.\r
And it only supports write BufferSize <= SpareAreaLength.\r
\r
- This boot service only protocol provides fault tolerant write capability for \r
+ This boot service protocol only provides fault tolerant write capability for \r
block devices. The protocol has internal non-volatile intermediate storage \r
of the data and private information. It should be able to recover \r
automatically from a critical fault, such as power failure. \r
The implementation uses an FTW Lite (Fault Tolerant Write) Work Space. \r
This work space is a memory copy of the work space on the Working Block,\r
the size of the work space is the FTW_WORK_SPACE_SIZE bytes.\r
+ \r
+ The work space stores each write record as EFI_FTW_LITE_RECORD structure.\r
+ The spare block stores the write buffer before write to the target block.\r
+ \r
+ The write record has three states to specify the different phase of write operation.\r
+ 1) WRITE_ALLOCATED is that the record is allocated in write space.\r
+ The write record structure records the information of write operation.\r
+ 2) SPARE_COMPLETED is that the data from write buffer is writed into the spare block as the backup.\r
+ 3) WRITE_COMPLETED is that the data is copied from the spare block to the target block.\r
+\r
+ This driver operates the data as the whole size of spare block. It also assumes that \r
+ working block is an area which contains working space in its last block and has the same size as spare block.\r
+ It first read the SpareAreaLength data from the target block into the spare memory buffer.\r
+ Then copy the write buffer data into the spare memory buffer.\r
+ Then write the spare memory buffer into the spare block.\r
+ Final copy the data from the spare block to the target block.\r
\r
Copyright (c) 2006 - 2008, Intel Corporation \r
All rights reserved. This program and the accompanying materials \r
Starts a target block update. This function will record data about write\r
in fault tolerant storage and will complete the write in a recoverable\r
manner, ensuring at all times that either the original contents or\r
- the modified contents are available. We should check the target\r
- range to prevent the user from writing Spare block and Working \r
- space directly.\r
+ the modified contents are available.\r
\r
- @param This Calling context\r
+ @param This The pointer to this protocol instance. \r
@param FvbHandle The handle of FVB protocol that provides services for\r
reading, writing, and erasing the target block.\r
@param Lba The logical block address of the target block.\r
@param NumBytes The number of bytes to write to the target block.\r
@param Buffer The data to write.\r
\r
- @retval EFI_SUCCESS The function completed successfully\r
- @retval EFI_BAD_BUFFER_SIZE The write would span a target block, which is not\r
- a valid action.\r
- @retval EFI_ACCESS_DENIED No writes have been allocated.\r
- @retval EFI_NOT_FOUND Cannot find FVB by handle.\r
- @retval EFI_OUT_OF_RESOURCES Cannot allocate memory.\r
- @retval EFI_ABORTED The function could not complete successfully.\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_OUT_OF_RESOURCES Cannot allocate enough memory resource.\r
+ @retval EFI_NOT_FOUND Cannot find FVB protocol by handle.\r
\r
**/\r
EFI_STATUS\r
//\r
// Check if there is enough free space for allocate a record\r
//\r
- if ((MyOffset + WRITE_TOTAL_SIZE) > FtwLiteDevice->FtwWorkSpaceSize) {\r
+ if ((MyOffset + FTW_LITE_RECORD_SIZE) > FtwLiteDevice->FtwWorkSpaceSize) {\r
Status = FtwReclaimWorkSpace (FtwLiteDevice, TRUE);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_ERROR, "FtwLite: Reclaim work space - %r", Status));\r
FreePool (MyBuffer);\r
\r
//\r
- // Set the SpareCompleteD in the FTW record,\r
+ // Set the SpareComplete in the FTW record,\r
//\r
MyOffset = (UINT8 *) Record - FtwLiteDevice->FtwWorkSpace;\r
Status = FtwUpdateFvState (\r
ASSERT_EFI_ERROR (Status);\r
\r
Status = FlushSpareBlockToWorkingBlock (FtwLiteDevice);\r
- } else if (IsBootBlock (FtwLiteDevice, Fvb, Record->Lba)) {\r
- //\r
- // Update boot block\r
- //\r
- Status = FlushSpareBlockToBootBlock (FtwLiteDevice);\r
} else {\r
//\r
// Update blocks other than working block or boot block\r
//\r
// Allocate Private data of this driver, including the FtwWorkSpace[FTW_WORK_SPACE_SIZE].\r
//\r
+ Length = FTW_WORK_SPACE_SIZE;\r
+ if (Length < PcdGet32 (PcdFlashNvStorageFtwWorkingSize)) {\r
+ Length = PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
+ }\r
+\r
FtwLiteDevice = NULL;\r
- FtwLiteDevice = AllocatePool (sizeof (EFI_FTW_LITE_DEVICE) + FTW_WORK_SPACE_SIZE);\r
+ FtwLiteDevice = AllocatePool (sizeof (EFI_FTW_LITE_DEVICE) + Length);\r
if (FtwLiteDevice != NULL) {\r
Status = EFI_SUCCESS;\r
} else {\r
//\r
FtwLiteDevice->FtwWorkSpace = (UINT8 *) (FtwLiteDevice + 1);\r
FtwLiteDevice->FtwWorkSpaceSize = FTW_WORK_SPACE_SIZE;\r
+ FtwLiteDevice->FtwWorkSpaceBase = FTW_WORK_SPACE_BASE;\r
SetMem (\r
FtwLiteDevice->FtwWorkSpace,\r
FtwLiteDevice->FtwWorkSpaceSize,\r
FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) BaseAddress);\r
\r
if ((FtwLiteDevice->WorkSpaceAddress >= BaseAddress) &&\r
- (FtwLiteDevice->WorkSpaceAddress <= (BaseAddress + FwVolHeader->FvLength))\r
+ (FtwLiteDevice->WorkSpaceAddress < (BaseAddress + FwVolHeader->FvLength))\r
) {\r
FtwLiteDevice->FtwFvBlock = Fvb;\r
//\r
FvbMapEntry = &FwVolHeader->BlockMap[0];\r
while (!((FvbMapEntry->NumBlocks == 0) && (FvbMapEntry->Length == 0))) {\r
for (LbaIndex = 1; LbaIndex <= FvbMapEntry->NumBlocks; LbaIndex += 1) {\r
- if (FtwLiteDevice->WorkSpaceAddress < (BaseAddress + FvbMapEntry->Length * LbaIndex)) {\r
+ if ((FtwLiteDevice->WorkSpaceAddress >= (BaseAddress + FvbMapEntry->Length * (LbaIndex - 1)))\r
+ && (FtwLiteDevice->WorkSpaceAddress < (BaseAddress + FvbMapEntry->Length * LbaIndex))) {\r
FtwLiteDevice->FtwWorkSpaceLba = LbaIndex - 1;\r
//\r
// Get the Work space size and Base(Offset)\r
//\r
// end for\r
//\r
+ if (LbaIndex <= FvbMapEntry->NumBlocks) {\r
+ //\r
+ // Work space range is found.\r
+ //\r
+ break;\r
+ }\r
FvbMapEntry++;\r
}\r
//\r
FvbMapEntry = &FwVolHeader->BlockMap[0];\r
while (!((FvbMapEntry->NumBlocks == 0) && (FvbMapEntry->Length == 0))) {\r
for (LbaIndex = 1; LbaIndex <= FvbMapEntry->NumBlocks; LbaIndex += 1) {\r
- if (FtwLiteDevice->SpareAreaAddress < (BaseAddress + FvbMapEntry->Length * LbaIndex)) {\r
+ if ((FtwLiteDevice->SpareAreaAddress >= (BaseAddress + FvbMapEntry->Length * (LbaIndex - 1)))\r
+ && (FtwLiteDevice->SpareAreaAddress < (BaseAddress + FvbMapEntry->Length * LbaIndex))) {\r
//\r
// Get the NumberOfSpareBlock and SizeOfSpareBlock\r
//\r
break;\r
}\r
}\r
-\r
+ if (LbaIndex <= FvbMapEntry->NumBlocks) {\r
+ //\r
+ // Spare FV range is found.\r
+ //\r
+ break;\r
+ }\r
FvbMapEntry++;\r
}\r
//\r
Record = FtwLiteDevice->FtwLastRecord;\r
Offset = (UINT8 *) Record - FtwLiteDevice->FtwWorkSpace;\r
if (FtwLiteDevice->FtwWorkSpace[Offset] != FTW_ERASED_BYTE) {\r
- Offset += WRITE_TOTAL_SIZE;\r
+ Offset += FTW_LITE_RECORD_SIZE;\r
}\r
\r
if (!IsErasedFlashBuffer (\r
\r
#include <PiDxe.h>\r
\r
-#include <Protocol/PciRootBridgeIo.h>\r
#include <Guid/SystemNvDataGuid.h>\r
#include <Protocol/FaultTolerantWriteLite.h>\r
#include <Protocol/FirmwareVolumeBlock.h>\r
//\r
// MACRO for FTW header and record\r
//\r
-#define FTW_WORKING_QUEUE_SIZE (FTW_WORK_SPACE_SIZE - sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER))\r
#define FTW_LITE_RECORD_SIZE (sizeof (EFI_FTW_LITE_RECORD))\r
-#define WRITE_TOTAL_SIZE FTW_LITE_RECORD_SIZE\r
\r
//\r
// EFI Fault tolerant protocol private data structure\r
This function is the entry point of the Fault Tolerant Write driver.\r
\r
\r
- @param ImageHandle EFI_HANDLE: A handle for the image that is initializing\r
+ @param ImageHandle A handle for the image that is initializing\r
this driver\r
- @param SystemTable EFI_SYSTEM_TABLE: A pointer to the EFI system table\r
+ @param SystemTable A pointer to the EFI system table\r
\r
@retval EFI_SUCCESS FTW has finished the initialization\r
@retval EFI_ABORTED FTW initialization error\r
#/** @file\r
-# Component description file for FtwLite module.\r
+# This driver provides lite fault tolerant capability for write operation on flash devices.\r
+# Its implementation depends on the full functionality FVB protocol that support read, write/erase flash access.\r
+# It only supports write BufferSize <= PcdFlashNvStorageFtwSpareSize.\r
+# That's the input write buffer data must fit within the spare range.\r
+# This driver doesn't differentiate the update for boot block and other block.\r
#\r
-# This driver provides fault tolerant write capability for block devices.\r
-# Copyright (c) 2006 - 2007, Intel Corporation\r
+# Copyright (c) 2006 - 2008, Intel Corporation\r
#\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
# 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
\r
[Defines]\r
FtwMisc.c\r
FtwLite.c\r
FtwLite.h\r
- \r
-[Sources.Ia32]\r
- Ia32/Ia32FtwMisc.c\r
-\r
-[Sources.X64]\r
- X64/X64FtwMisc.c\r
-\r
-[Sources.IPF]\r
- Ipf/IpfFtwMisc.c\r
-\r
-[Sources.EBC]\r
- Ia32/Ia32FtwMisc.c\r
-\r
\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
\r
-\r
-\r
[LibraryClasses]\r
UefiBootServicesTableLib\r
MemoryAllocationLib\r
DevicePathLib\r
\r
[Guids]\r
- gEfiSystemNvDataFvGuid # ALWAYS_CONSUMED\r
+ gEfiSystemNvDataFvGuid # ALWAYS_CONSUMED, Signature of Working Space Header\r
\r
[Protocols]\r
gEfiFirmwareVolumeBlockProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
gEfiFaultTolerantWriteLiteProtocolGuid # PROTOCOL ALWAYS_PRODUCED\r
\r
-[Protocols.IA32]\r
- gEfiPciRootBridgeIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
-\r
-[Protocols.EBC]\r
- gEfiPciRootBridgeIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
-\r
-\r
[Pcd.common]\r
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize\r
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase\r
/** @file\r
\r
- Internal generic functions to support fault tolerant write.\r
+ Internal generic functions to operate flash block.\r
\r
Copyright (c) 2006 - 2008, Intel Corporation \r
All rights reserved. This program and the accompanying materials \r
}\r
\r
/**\r
- To Erase one block. The size is FTW_BLOCK_SIZE\r
+ To erase the block with the spare block size.\r
\r
\r
@param FtwLiteDevice Calling context\r
&gEfiSystemNvDataFvGuid,\r
sizeof (EFI_GUID)\r
);\r
- WorkingHeader->WriteQueueSize = FTW_WORKING_QUEUE_SIZE;\r
+ WorkingHeader->WriteQueueSize = (UINT64) (PcdGet32 (PcdFlashNvStorageFtwWorkingSize) - sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER));\r
\r
//\r
// Crc is calculated with all the fields except Crc and STATE\r
// If work space has error or Record is out of the workspace limit, THEN\r
// call reclaim.\r
//\r
- if (EFI_ERROR (Status) || (Offset + WRITE_TOTAL_SIZE >= FtwLiteDevice->FtwWorkSpaceSize)) {\r
+ if (EFI_ERROR (Status) || (Offset + FTW_LITE_RECORD_SIZE >= FtwLiteDevice->FtwWorkSpaceSize)) {\r
//\r
// reclaim work space in working block.\r
//\r
CopyMem (\r
(UINT8 *) Ptr + sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
Record,\r
- WRITE_TOTAL_SIZE\r
+ FTW_LITE_RECORD_SIZE\r
);\r
}\r
}\r
+++ /dev/null
-/** @file\r
- \r
- Ia32 platform related code to support FtwLite.\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
-\r
-#include "FtwLite.h"\r
-\r
-//\r
-// MACROs for boot block update\r
-//\r
-#define BOOT_BLOCK_BASE 0xFFFF0000\r
-\r
-//\r
-// (LPC -- D31:F0)\r
-//\r
-#define LPC_BUS_NUMBER 0x00\r
-#define LPC_DEVICE_NUMBER 0x1F\r
-#define LPC_IF 0xF0\r
-//\r
-// Top swap\r
-//\r
-#define GEN_STATUS 0xD4\r
-#define TOP_SWAP_BIT (1 << 13)\r
-\r
-/**\r
-\r
- Read PCI register value.\r
- This is a internal function.\r
-\r
-\r
- @param Offset Offset of the register\r
-\r
- @return The pci register value.\r
-\r
-**/\r
-UINT32\r
-ReadPciRegister (\r
- IN UINT32 Offset\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT32 Value;\r
- EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
-\r
- Value = 0;\r
- Status = gBS->LocateProtocol (&gEfiPciRootBridgeIoProtocolGuid, NULL, (VOID **) &PciRootBridgeIo);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "FtwLite: Locate PCI root bridge io protocol - %r", Status));\r
- return 0;\r
- }\r
-\r
- Status = PciRootBridgeIo->Pci.Read (\r
- PciRootBridgeIo,\r
- EfiPciWidthUint32,\r
- EFI_PCI_ADDRESS (\r
- LPC_BUS_NUMBER,\r
- LPC_DEVICE_NUMBER,\r
- LPC_IF,\r
- Offset\r
- ),\r
- 1,\r
- &Value\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return Value;\r
-}\r
-\r
-/**\r
-\r
- Get swap state\r
-\r
- This is a internal function.\r
-\r
- @param FtwLiteDevice Calling context\r
- @param SwapState Swap state\r
-\r
- @retval EFI_SUCCESS State successfully got\r
-\r
-**/\r
-EFI_STATUS\r
-GetSwapState (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- OUT BOOLEAN *SwapState\r
- )\r
-{\r
- //\r
- // Top swap status is 13 bit\r
- //\r
- *SwapState = (BOOLEAN) ((ReadPciRegister (GEN_STATUS) & TOP_SWAP_BIT) != 0);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Set swap state.\r
-\r
- This is a internal function.\r
-\r
- @param FtwLiteDevice Indicates a pointer to the calling context.\r
- @param TopSwap New swap state\r
-\r
- @retval EFI_SUCCESS The function completed successfully\r
- Note:\r
- the Top-Swap bit (bit 13, D31: F0, Offset D4h). Note that\r
- software will not be able to clear the Top-Swap bit until the system is\r
- rebooted without GNT[A]# being pulled down.\r
-\r
-**/\r
-EFI_STATUS\r
-SetSwapState (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- IN BOOLEAN TopSwap\r
- )\r
-{\r
- UINT32 GenStatus;\r
- EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Top-Swap bit (bit 13, D31: F0, Offset D4h)\r
- //\r
- GenStatus = ReadPciRegister (GEN_STATUS);\r
-\r
- //\r
- // Set 13 bit, according to input NewSwapState\r
- //\r
- if (TopSwap) {\r
- GenStatus |= TOP_SWAP_BIT;\r
- } else {\r
- GenStatus &= ~TOP_SWAP_BIT;\r
- }\r
-\r
- Status = gBS->LocateProtocol (&gEfiPciRootBridgeIoProtocolGuid, NULL, (VOID **) &PciRootBridgeIo);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "FtwLite: Locate PCI root bridge io protocol - %r", Status));\r
- return Status;\r
- }\r
- //\r
- // Write back the GenStatus register\r
- //\r
- Status = PciRootBridgeIo->Pci.Write (\r
- PciRootBridgeIo,\r
- EfiPciWidthUint32,\r
- EFI_PCI_ADDRESS (\r
- LPC_BUS_NUMBER,\r
- LPC_DEVICE_NUMBER,\r
- LPC_IF,\r
- GEN_STATUS\r
- ),\r
- 1,\r
- &GenStatus\r
- );\r
-\r
- DEBUG_CODE_BEGIN ();\r
- if (TopSwap) {\r
- DEBUG ((EFI_D_ERROR, "SAR: Set top swap\n"));\r
- } else {\r
- DEBUG ((EFI_D_ERROR, "SAR: Clear top swap\n"));\r
- }\r
- DEBUG_CODE_END ();\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
- Check whether the block is a boot block.\r
-\r
-\r
- @param FtwLiteDevice Calling context\r
- @param FvBlock Fvb protocol instance\r
- @param Lba Lba value\r
-\r
- @retval FALSE This is a boot block.\r
- @retval TRUE This is not a boot block.\r
-\r
-**/\r
-BOOLEAN\r
-IsBootBlock (\r
- EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
- EFI_LBA Lba\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *BootFvb;\r
-\r
- Status = GetFvbByAddress (BOOT_BLOCK_BASE, &BootFvb);\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
- //\r
- // Compare the Fvb\r
- //\r
- return (BOOLEAN) (FvBlock == BootFvb);\r
-}\r
-\r
-/**\r
- Copy the content of spare block to a boot block. Size is FTW_BLOCK_SIZE.\r
- Spare block is accessed by FTW backup FVB protocol interface. LBA is\r
- FtwLiteDevice->FtwSpareLba.\r
- Boot block is accessed by BootFvb protocol interface. LBA is 0.\r
-\r
-\r
- @param FtwLiteDevice The private data of FTW_LITE driver\r
-\r
- @retval EFI_SUCCESS Spare block content is copied to boot block\r
- @retval EFI_INVALID_PARAMETER Input parameter error\r
- @retval EFI_OUT_OF_RESOURCES Allocate memory error\r
- @retval EFI_ABORTED The function could not complete successfully\r
- Notes:\r
- FTW will do extra work on boot block update.\r
- FTW should depend on a protocol of EFI_ADDRESS_RANGE_SWAP_PROTOCOL,\r
- which is produced by a chipset driver.\r
- FTW updating boot block steps:\r
- 1. Erase top swap block (0xFFFE-0xFFFEFFFF) and write data to it ready\r
- 2. Read data from top swap block to memory buffer\r
- 3. SetSwapState(EFI_SWAPPED)\r
- 4. Erasing boot block (0xFFFF-0xFFFFFFFF)\r
- 5. Programming boot block until the boot block is ok.\r
- 6. SetSwapState(UNSWAPPED)\r
- Notes:\r
- 1. Since the SwapState bit is saved in CMOS, FTW can restore and continue\r
- even in the scenario of power failure.\r
- 2. FTW shall not allow to update boot block when battery state is error.\r
-\r
-**/\r
-EFI_STATUS\r
-FlushSpareBlockToBootBlock (\r
- EFI_FTW_LITE_DEVICE *FtwLiteDevice\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Length;\r
- UINT8 *Buffer;\r
- UINTN Count;\r
- UINT8 *Ptr;\r
- UINTN Index;\r
- BOOLEAN TopSwap;\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *BootFvb;\r
- EFI_LBA BootLba;\r
-\r
- //\r
- // Allocate a memory buffer\r
- //\r
- Length = FtwLiteDevice->SpareAreaLength;\r
- Buffer = AllocatePool (Length);\r
- if (Buffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Get TopSwap bit state\r
- //\r
- Status = GetSwapState (FtwLiteDevice, &TopSwap);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "FtwLite: Get Top Swapped status - %r\n", Status));\r
- FreePool (Buffer);\r
- return EFI_ABORTED;\r
- }\r
-\r
- if (TopSwap) {\r
- //\r
- // Get FVB of current boot block\r
- //\r
- Status = GetFvbByAddress (FtwLiteDevice->SpareAreaAddress + FTW_BLOCK_SIZE, &BootFvb);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (Buffer);\r
- return Status;\r
- }\r
- //\r
- // Read data from current boot block\r
- //\r
- BootLba = 0;\r
- Ptr = Buffer;\r
- for (Index = 0; Index < FtwLiteDevice->NumberOfSpareBlock; Index += 1) {\r
- Count = FtwLiteDevice->SizeOfSpareBlock;\r
- Status = BootFvb->Read (\r
- BootFvb,\r
- BootLba + Index,\r
- 0,\r
- &Count,\r
- Ptr\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreePool (Buffer);\r
- return Status;\r
- }\r
-\r
- Ptr += Count;\r
- }\r
-\r
- } else {\r
- //\r
- // Read data from spare block\r
- //\r
- Ptr = Buffer;\r
- for (Index = 0; Index < FtwLiteDevice->NumberOfSpareBlock; Index += 1) {\r
- Count = FtwLiteDevice->SizeOfSpareBlock;\r
- Status = FtwLiteDevice->FtwBackupFvb->Read (\r
- FtwLiteDevice->FtwBackupFvb,\r
- FtwLiteDevice->FtwSpareLba + Index,\r
- 0,\r
- &Count,\r
- Ptr\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreePool (Buffer);\r
- return Status;\r
- }\r
-\r
- Ptr += Count;\r
- }\r
- //\r
- // Set TopSwap bit\r
- //\r
- Status = SetSwapState (FtwLiteDevice, TRUE);\r
- DEBUG ((EFI_D_ERROR, "FtwLite: Set Swap State - %r\n", Status));\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
- //\r
- // Erase boot block. After setting TopSwap bit, it's spare block now!\r
- //\r
- Status = FtwEraseSpareBlock (FtwLiteDevice);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (Buffer);\r
- return EFI_ABORTED;\r
- }\r
- //\r
- // Write memory buffer to currenet spare block\r
- //\r
- Ptr = Buffer;\r
- for (Index = 0; Index < FtwLiteDevice->NumberOfSpareBlock; Index += 1) {\r
- Count = FtwLiteDevice->SizeOfSpareBlock;\r
- Status = FtwLiteDevice->FtwBackupFvb->Write (\r
- FtwLiteDevice->FtwBackupFvb,\r
- FtwLiteDevice->FtwSpareLba + Index,\r
- 0,\r
- &Count,\r
- Ptr\r
- );\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_FTW_LITE, "FtwLite: FVB Write boot block - %r\n", Status));\r
- FreePool (Buffer);\r
- return Status;\r
- }\r
-\r
- Ptr += Count;\r
- }\r
-\r
- FreePool (Buffer);\r
-\r
- //\r
- // Clear TopSwap bit\r
- //\r
- Status = SetSwapState (FtwLiteDevice, FALSE);\r
- DEBUG ((EFI_D_ERROR, "FtwLite: Clear Swap State - %r\n", Status));\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return EFI_SUCCESS;\r
-}\r
+++ /dev/null
-/** @file\r
-\r
- Ipf platform related code to support FtwLite..\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
-\r
-#include "FtwLite.h"\r
-\r
-//\r
-// MACROs for boot block update\r
-//\r
-#define BOOT_BLOCK_BASE\r
-\r
-/**\r
-\r
- Get swap state\r
- This is a internal function.\r
-\r
- @param FtwLiteDevice Calling context\r
- @param SwapState Swap state\r
-\r
- @retval EFI_SUCCESS State successfully got\r
-\r
-**/\r
-EFI_STATUS\r
-GetSwapState (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- OUT BOOLEAN *SwapState\r
- )\r
-{\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Set swap state.\r
- This is a internal function.\r
-\r
-\r
- @param FtwLiteDevice Indicates a pointer to the calling context.\r
- @param TopSwap New swap state\r
-\r
- @retval EFI_SUCCESS The function completed successfully\r
- Note:\r
- the Top-Swap bit (bit 13, D31: F0, Offset D4h). Note that\r
- software will not be able to clear the Top-Swap bit until the system is\r
- rebooted without GNT[A]# being pulled down.\r
-\r
-**/\r
-EFI_STATUS\r
-SetSwapState (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- IN BOOLEAN TopSwap\r
- )\r
-{\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
- Check whether the block is a boot block.\r
-\r
-\r
- @param FtwLiteDevice Calling context\r
- @param FvBlock Fvb protocol instance\r
- @param Lba Lba value\r
-\r
- @retval FALSE This is a boot block.\r
- @retval TRUE This is not a boot block.\r
-\r
-**/\r
-BOOLEAN\r
-IsBootBlock (\r
- EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
- EFI_LBA Lba\r
- )\r
-{\r
- //\r
- // IPF doesn't support safe bootblock update\r
- // so treat bootblock as normal block\r
- //\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Copy the content of spare block to a boot block. Size is FTW_BLOCK_SIZE.\r
- Spare block is accessed by FTW backup FVB protocol interface. LBA is\r
- FtwLiteDevice->FtwSpareLba.\r
- Boot block is accessed by BootFvb protocol interface. LBA is 0.\r
-\r
-\r
- @param FtwLiteDevice The private data of FTW_LITE driver\r
-\r
- @retval EFI_SUCCESS Spare block content is copied to boot block\r
- @retval EFI_INVALID_PARAMETER Input parameter error\r
- @retval EFI_OUT_OF_RESOURCES Allocate memory error\r
- @retval EFI_ABORTED The function could not complete successfully\r
- Notes:\r
-\r
-**/\r
-EFI_STATUS\r
-FlushSpareBlockToBootBlock (\r
- EFI_FTW_LITE_DEVICE *FtwLiteDevice\r
- )\r
-{\r
- return EFI_SUCCESS;\r
-}\r
+++ /dev/null
-/** @file\r
- \r
- X64 platform related code to support FtwLite.\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
-\r
-#include "FtwLite.h"\r
-\r
-//\r
-// MACROs for boot block update\r
-//\r
-#define BOOT_BLOCK_BASE\r
-\r
-/**\r
-\r
- Get swap state.\r
-\r
-\r
- @param FtwLiteDevice Calling context\r
- @param SwapState Swap state\r
-\r
- @retval EFI_SUCCESS State successfully read.\r
-\r
-**/\r
-EFI_STATUS\r
-GetSwapState (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- OUT BOOLEAN *SwapState\r
- )\r
-{\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Set swap state.\r
-\r
-\r
- @param FtwLiteDevice Indicates a pointer to the calling context.\r
- @param TopSwap New swap state\r
-\r
- @retval EFI_SUCCESS The function completed successfully\r
- Note:\r
- the Top-Swap bit (bit 13, D31: F0, Offset D4h). Note that\r
- software will not be able to clear the Top-Swap bit until the system is\r
- rebooted without GNT[A]# being pulled down.\r
-\r
-**/\r
-EFI_STATUS\r
-SetSwapState (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- IN BOOLEAN TopSwap\r
- )\r
-{\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
- Check whether the block is a boot block.\r
-\r
-\r
- @param FtwLiteDevice Calling context\r
- @param FvBlock Fvb protocol instance\r
- @param Lba Lba value\r
-\r
- @retval FALSE This is a boot block.\r
- @retval TRUE This is not a boot block.\r
-\r
-**/\r
-BOOLEAN\r
-IsBootBlock (\r
- EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock,\r
- EFI_LBA Lba\r
- )\r
-{\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Copy the content of spare block to a boot block. Size is FTW_BLOCK_SIZE.\r
- Spare block is accessed by FTW backup FVB protocol interface. LBA is\r
- FtwLiteDevice->FtwSpareLba.\r
- Boot block is accessed by BootFvb protocol interface. LBA is 0.\r
-\r
-\r
- @param FtwLiteDevice The private data of FTW_LITE driver\r
-\r
- @retval EFI_SUCCESS Spare block content is copied to boot block\r
- @retval EFI_INVALID_PARAMETER Input parameter error\r
- @retval EFI_OUT_OF_RESOURCES Allocate memory error\r
- @retval EFI_ABORTED The function could not complete successfully\r
- Notes:\r
-\r
-**/\r
-EFI_STATUS\r
-FlushSpareBlockToBootBlock (\r
- EFI_FTW_LITE_DEVICE *FtwLiteDevice\r
- )\r
-{\r
- return EFI_SUCCESS;\r
-}\r
/** @file \r
-PCD PEIM produces PCD database to manage all dynamic PCD in PEI phase and install Pcd Ppi.\r
+ All Pcd Ppi services are implemented here.\r
\r
Copyright (c) 2006 - 2008, Intel Corporation \r
All rights reserved. This program and the accompanying materials \r
(*CurrentSize == MAX_ADDRESS)) {\r
*CurrentSize = MaxSize;\r
return FALSE;\r
- } \r
+ }\r
\r
if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
//\r
/** @file\r
-Private functions used by PCD PEIM.\r
+ The driver internal functions are implmented here.\r
+ They build Pei PCD database, and provide access service to PCD database.\r
\r
Copyright (c) 2006 - 2008, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
/** @file\r
-Private functions used by PCD PEIM.\r
+ The internal header file declares the private functions used by PeiPcd driver.\r
\r
Copyright (c) 2006 - 2008, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r