summaryrefslogtreecommitdiffstats
path: root/EdkNt32Pkg/RuntimeDxe
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2006-09-14 14:18:20 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2006-09-14 14:18:20 +0000
commit0f008d9ad4365c885b21c95c3b52d6266b3169e4 (patch)
treefaf06f0b53cc59c50e142a51bb9c8bd7a04b524e /EdkNt32Pkg/RuntimeDxe
parent8aab007a7d10cfe76f85398ee06b0169e3333532 (diff)
downloadedk2-0f008d9ad4365c885b21c95c3b52d6266b3169e4.tar.gz
edk2-0f008d9ad4365c885b21c95c3b52d6266b3169e4.tar.bz2
edk2-0f008d9ad4365c885b21c95c3b52d6266b3169e4.zip
Remove platform-specific Firmware Volume Block Driver implementation from EdkNt32Pkg. And move files from nt32 directory up one level.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1540 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkNt32Pkg/RuntimeDxe')
-rw-r--r--EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FWBlockService.c1939
-rw-r--r--EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FwBlockService.h324
-rw-r--r--EdkNt32Pkg/RuntimeDxe/FvbServices/Common/ia32/Ia32Fwh.c42
-rw-r--r--EdkNt32Pkg/RuntimeDxe/FvbServices/FWBlockService.c (renamed from EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FWBlockService.c)0
-rw-r--r--EdkNt32Pkg/RuntimeDxe/FvbServices/FvbInfo.c (renamed from EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FvbInfo.c)0
-rw-r--r--EdkNt32Pkg/RuntimeDxe/FvbServices/FwBlockService.h (renamed from EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FwBlockService.h)0
-rw-r--r--EdkNt32Pkg/RuntimeDxe/FvbServices/Nt32Fwh.msa13
7 files changed, 5 insertions, 2313 deletions
diff --git a/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FWBlockService.c b/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FWBlockService.c
deleted file mode 100644
index e22a3233c4..0000000000
--- a/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FWBlockService.c
+++ /dev/null
@@ -1,1939 +0,0 @@
-/*++
-
-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:
-
- FWBlockService.c
-
-Abstract:
-
-Revision History
-
---*/
-
-#include "FWBlockService.h"
-#include "EfiFlashMap.h"
-#include EFI_GUID_DEFINITION (FlashMapHob)
-
-ESAL_FWB_GLOBAL *mFvbModuleGlobal;
-
-EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {
- FVB_DEVICE_SIGNATURE,
- {
- {
- {
- HARDWARE_DEVICE_PATH,
- HW_MEMMAP_DP,
- {
- sizeof (MEMMAP_DEVICE_PATH),
- 0
- }
- },
- EfiMemoryMappedIO,
- 0,
- 0,
- },
- {
- END_DEVICE_PATH_TYPE,
- END_ENTIRE_DEVICE_PATH_SUBTYPE,
- {
- sizeof (EFI_DEVICE_PATH_PROTOCOL),
- 0
- }
- }
- },
- 0,
- {
- FvbProtocolGetAttributes,
- FvbProtocolSetAttributes,
- FvbProtocolGetPhysicalAddress,
- FvbProtocolGetBlockSize,
- FvbProtocolRead,
- FvbProtocolWrite,
- FvbProtocolEraseBlocks,
- NULL
- },
- {
- FvbExtendProtocolEraseCustomBlockRange
- }
-};
-
-EFI_DRIVER_ENTRY_POINT (FvbInitialize)
-
-
-VOID
-EFIAPI
-FvbVirtualddressChangeEvent (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-/*++
-
-Routine Description:
-
- Fixup internal data so that EFI and SAL can be call in virtual mode.
- Call the passed in Child Notify event and convert the mFvbModuleGlobal
- date items to there virtual address.
-
- mFvbModuleGlobal->FvInstance[FVB_PHYSICAL] - Physical copy of instance data
- mFvbModuleGlobal->FvInstance[FVB_VIRTUAL] - Virtual pointer to common
- instance data.
-
-Arguments:
-
- (Standard EFI notify event - EFI_EVENT_NOTIFY)
-
-Returns:
-
- None
-
---*/
-{
- EFI_FW_VOL_INSTANCE *FwhInstance;
- UINTN Index;
-
- EfiConvertPointer (EFI_INTERNAL_POINTER, (VOID **) &mFvbModuleGlobal->FvInstance[FVB_VIRTUAL]);
-
- //
- // Convert the base address of all the instances
- //
- Index = 0;
- FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
- while (Index < mFvbModuleGlobal->NumFv) {
- EfiConvertPointer (EFI_INTERNAL_POINTER, (VOID **) &FwhInstance->FvBase[FVB_VIRTUAL]);
- EfiConvertPointer (EFI_INTERNAL_POINTER, (VOID **) &FwhInstance->FvWriteBase[FVB_VIRTUAL]);
- FwhInstance = (EFI_FW_VOL_INSTANCE *) ((UINTN)((UINT8 *)FwhInstance) + FwhInstance->VolumeHeader.HeaderLength
- + (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER)));
- Index++;
- }
-
- EfiConvertPointer (EFI_INTERNAL_POINTER, (VOID **) &mFvbModuleGlobal->FvbScratchSpace[FVB_VIRTUAL]);
- EfiConvertPointer (EFI_INTERNAL_POINTER, (VOID **) &mFvbModuleGlobal);
-}
-
-VOID
-FvbMemWrite8 (
- IN UINT64 Dest,
- IN UINT8 Byte
- )
-{
- EfiMemWrite (EfiCpuIoWidthUint8, Dest, 1, &Byte);
-
- return ;
-}
-
-EFI_STATUS
-GetFvbInstance (
- IN UINTN Instance,
- IN ESAL_FWB_GLOBAL *Global,
- OUT EFI_FW_VOL_INSTANCE **FwhInstance,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Retrieves the physical address of a memory mapped FV
-
-Arguments:
- Instance - The FV instance whose base address is going to be
- returned
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- FwhInstance - The EFI_FW_VOL_INSTANCE fimrware instance structure
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - Successfully returns
- EFI_INVALID_PARAMETER - Instance not found
-
---*/
-{
- EFI_FW_VOL_INSTANCE *FwhRecord;
-
- if (Instance >= Global->NumFv) {
- return EFI_INVALID_PARAMETER;
- }
- //
- // Find the right instance of the FVB private data
- //
- FwhRecord = Global->FvInstance[Virtual];
- while (Instance > 0) {
- FwhRecord = (EFI_FW_VOL_INSTANCE *) ((UINTN)((UINT8 *)FwhRecord) + FwhRecord->VolumeHeader.HeaderLength
- + (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER)));
- Instance--;
- }
-
- *FwhInstance = FwhRecord;
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-FvbGetPhysicalAddress (
- IN UINTN Instance,
- OUT EFI_PHYSICAL_ADDRESS *Address,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Retrieves the physical address of a memory mapped FV
-
-Arguments:
- Instance - The FV instance whose base address is going to be
- returned
- Address - Pointer to a caller allocated EFI_PHYSICAL_ADDRESS
- that on successful return, contains the base address
- of the firmware volume.
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - Successfully returns
- EFI_INVALID_PARAMETER - Instance not found
-
---*/
-{
- EFI_FW_VOL_INSTANCE *FwhInstance;
- EFI_STATUS Status;
-
- //
- // Find the right instance of the FVB private data
- //
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
- ASSERT_EFI_ERROR (Status);
- *Address = FwhInstance->FvBase[Virtual];
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-FvbGetVolumeAttributes (
- IN UINTN Instance,
- OUT EFI_FVB_ATTRIBUTES *Attributes,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Retrieves attributes, insures positive polarity of attribute bits, returns
- resulting attributes in output parameter
-
-Arguments:
- Instance - The FV instance whose attributes is going to be
- returned
- Attributes - Output buffer which contains attributes
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - Successfully returns
- EFI_INVALID_PARAMETER - Instance not found
-
---*/
-{
- EFI_FW_VOL_INSTANCE *FwhInstance;
- EFI_STATUS Status;
-
- //
- // Find the right instance of the FVB private data
- //
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
- ASSERT_EFI_ERROR (Status);
- *Attributes = FwhInstance->VolumeHeader.Attributes;
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-FvbGetLbaAddress (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- OUT UINTN *LbaAddress,
- OUT UINTN *LbaWriteAddress,
- OUT UINTN *LbaLength,
- OUT UINTN *NumOfBlocks,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Retrieves the starting address of an LBA in an FV
-
-Arguments:
- Instance - The FV instance which the Lba belongs to
- Lba - The logical block address
- LbaAddress - On output, contains the physical starting address
- of the Lba
- LbaWriteAddress - On output, contains the physical starting address
- of the Lba for writing
- LbaLength - On output, contains the length of the block
- NumOfBlocks - A pointer to a caller allocated UINTN in which the
- number of consecutive blocks starting with Lba is
- returned. All blocks in this range have a size of
- BlockSize
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - Successfully returns
- EFI_INVALID_PARAMETER - Instance not found
-
---*/
-{
- UINT32 NumBlocks;
- UINT32 BlockLength;
- UINTN Offset;
- EFI_LBA StartLba;
- EFI_LBA NextLba;
- EFI_FW_VOL_INSTANCE *FwhInstance;
- EFI_FV_BLOCK_MAP_ENTRY *BlockMap;
- EFI_STATUS Status;
-
- //
- // Find the right instance of the FVB private data
- //
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
- ASSERT_EFI_ERROR (Status);
-
- StartLba = 0;
- Offset = 0;
- BlockMap = &(FwhInstance->VolumeHeader.FvBlockMap[0]);
-
- //
- // Parse the blockmap of the FV to find which map entry the Lba belongs to
- //
- while (TRUE) {
- NumBlocks = BlockMap->NumBlocks;
- BlockLength = BlockMap->BlockLength;
-
- if (NumBlocks == 0 || BlockLength == 0) {
- return EFI_INVALID_PARAMETER;
- }
-
- NextLba = StartLba + NumBlocks;
-
- //
- // The map entry found
- //
- if (Lba >= StartLba && Lba < NextLba) {
- Offset = Offset + (UINTN) MultU64x32 ((Lba - StartLba), BlockLength);
- if (LbaAddress) {
- *LbaAddress = FwhInstance->FvBase[Virtual] + Offset;
- }
-
- if (LbaWriteAddress) {
- *LbaWriteAddress = FwhInstance->FvWriteBase[Virtual] + Offset;
- }
-
- if (LbaLength) {
- *LbaLength = BlockLength;
- }
-
- if (NumOfBlocks) {
- *NumOfBlocks = (UINTN) (NextLba - Lba);
- }
-
- return EFI_SUCCESS;
- }
-
- StartLba = NextLba;
- Offset = Offset + NumBlocks * BlockLength;
- BlockMap++;
- }
-}
-
-EFI_STATUS
-FvbReadBlock (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- IN UINTN BlockOffset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Reads specified number of bytes into a buffer from the specified block
-
-Arguments:
- Instance - The FV instance to be read from
- Lba - The logical block address to be read from
- BlockOffset - Offset into the block at which to begin reading
- NumBytes - Pointer that on input contains the total size of
- the buffer. On output, it contains the total number
- of bytes read
- Buffer - Pointer to a caller allocated buffer that will be
- used to hold the data read
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - The firmware volume was read successfully and
- contents are in Buffer
- EFI_BAD_BUFFER_SIZE - Read attempted across a LBA boundary. On output,
- NumBytes contains the total number of bytes returned
- in Buffer
- EFI_ACCESS_DENIED - The firmware volume is in the ReadDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be read
- EFI_INVALID_PARAMETER - Instance not found, or NumBytes, Buffer are NULL
-
---*/
-{
- EFI_FVB_ATTRIBUTES Attributes;
- UINTN LbaAddress;
- UINTN LbaLength;
- EFI_STATUS Status;
-
- //
- // Check for invalid conditions
- //
- if ((NumBytes == NULL) || (Buffer == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (*NumBytes == 0) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = FvbGetLbaAddress (Instance, Lba, &LbaAddress, NULL, &LbaLength, NULL, Global, Virtual);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Check if the FV is read enabled
- //
- FvbGetVolumeAttributes (Instance, &Attributes, Global, Virtual);
-
- if ((Attributes & EFI_FVB_READ_STATUS) == 0) {
- return EFI_ACCESS_DENIED;
- }
- //
- // Perform boundary checks and adjust NumBytes
- //
- if (BlockOffset > LbaLength) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (LbaLength < (*NumBytes + BlockOffset)) {
- *NumBytes = (UINT32) (LbaLength - BlockOffset);
- Status = EFI_BAD_BUFFER_SIZE;
- }
-
- EfiMemRead (EfiCpuIoWidthUint8, LbaAddress + BlockOffset, (UINTN) *NumBytes, Buffer);
-
- return Status;
-}
-
-EFI_STATUS
-FlashFdWrite (
- IN UINTN WriteAddress,
- IN UINTN Address,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer,
- IN UINTN LbaLength
- )
-/*++
-
-Routine Description:
- Writes specified number of bytes from the input buffer to the address
-
-Arguments:
-
-Returns:
-
---*/
-{
- UINT8 *Src;
- UINT8 *Dest;
- UINTN Count;
- EFI_STATUS Status;
- UINT8 HubCommand;
- UINT8 HubData;
- UINTN RetryTimes;
-
- Status = EFI_SUCCESS;
-
- EnableFvbWrites (TRUE);
-
- //
- // Grab the lock before entering critical code section
- //
- // bugbug
- // Commented out since locking mechanisium is not correctly implemented
- // on IA32 so that it will assert in runtime environment.
- //
- // EfiAcquireLock(&(FwhInstance->FvbDevLock));
- //
- // Write data one byte at a time, don't write if the src and dest bytes match
- //
- Dest = (UINT8 *) WriteAddress;
- Src = Buffer;
-
- for (Count = 0; Count < *NumBytes; Count++, Dest++, Src++) {
-
- HubCommand = FWH_WRITE_SETUP_COMMAND;
- FvbMemWrite8 ((UINT64) ((UINTN) Dest), HubCommand);
- FvbMemWrite8 ((UINT64) ((UINTN) Dest), *Src);
- HubCommand = FWH_READ_STATUS_COMMAND;
- FvbMemWrite8 ((UINT64) ((UINTN) Dest), HubCommand);
-
- //
- // Device error if time out occurs
- //
- RetryTimes = 0;
- while (RetryTimes < FVB_MAX_RETRY_TIMES) {
- EfiMemRead (EfiCpuIoWidthUint8, (UINT64) ((UINTN) Dest), 0x1, &HubData);
- if (HubData & FWH_WRITE_STATE_STATUS) {
- break;
- }
-
- RetryTimes++;
- }
-
- if (RetryTimes >= FVB_MAX_RETRY_TIMES) {
- *NumBytes = Count;
- Status = EFI_DEVICE_ERROR;
- break;
- }
- }
- //
- // Clear status register
- //
- HubCommand = FWH_CLEAR_STATUS_COMMAND;
- FvbMemWrite8 ((UINT64) ((UINTN) Dest), HubCommand);
-
- //
- // Issue read array command to return the FWH state machine to the
- // normal operational state
- //
- HubCommand = FWH_READ_ARRAY_COMMAND;
- FvbMemWrite8 ((UINT64) ((UINTN) WriteAddress), HubCommand);
- //
- // Flush the changed area to make the cache consistent
- //
- EfiCpuFlushCache (WriteAddress, *NumBytes);
-
- //
- // End of critical code section, release lock.
- //
- // EfiReleaseLock(&(FwhInstance->FvbDevLock));
- //
- EnableFvbWrites (FALSE);
-
- return Status;
-}
-
-EFI_STATUS
-FlashFdErase (
- IN UINTN WriteAddress,
- IN UINTN Address,
- IN UINTN LbaLength
- )
-/*++
-
-Routine Description:
- Erase a certain block from address LbaWriteAddress
-
-Arguments:
-
-Returns:
-
---*/
-{
- EFI_STATUS Status;
- UINT8 HubCommand;
- UINT8 HubData;
- UINTN RetryTimes;
-
- Status = EFI_SUCCESS;
-
- EnableFvbWrites (TRUE);
-
- //
- // Grab the lock before entering critical code section
- //
- // EfiAcquireLock(&(FwhInstance->FvbDevLock));
- //
- // Send erase commands to FWH
- //
- HubCommand = FWH_BLOCK_ERASE_SETUP_COMMAND;
- FvbMemWrite8 ((UINT64) WriteAddress, HubCommand);
- HubCommand = FWH_BLOCK_ERASE_CONFIRM_COMMAND;
- FvbMemWrite8 ((UINT64) WriteAddress, HubCommand);
- HubCommand = FWH_READ_STATUS_COMMAND;
- FvbMemWrite8 ((UINT64) WriteAddress, HubCommand);
-
- //
- // Wait for completion. Indicated by FWH_WRITE_STATE_STATUS bit becoming 0
- // Device error if time out occurs
- //
- RetryTimes = 0;
- while (RetryTimes < FVB_MAX_RETRY_TIMES) {
- EfiMemRead (EfiCpuIoWidthUint8, (UINT64) WriteAddress, 0x1, &HubData);
- if (HubData & FWH_WRITE_STATE_STATUS) {
- break;
- }
-
- RetryTimes++;
- }
-
- if (RetryTimes >= FVB_MAX_RETRY_TIMES) {
- Status = EFI_DEVICE_ERROR;
- }
- //
- // Clear status register
- //
- HubCommand = FWH_CLEAR_STATUS_COMMAND;
- FvbMemWrite8 ((UINT64) WriteAddress, HubCommand);
-
- //
- // Issue read array command to return the FWH state machine to the normal op state
- //
- HubCommand = FWH_READ_ARRAY_COMMAND;
- FvbMemWrite8 ((UINT64) ((UINTN) WriteAddress), HubCommand);
-
- EfiCpuFlushCache (Address, LbaLength);
-
- //
- // End of critical code section, release lock.
- //
- // EfiReleaseLock(&(FwhInstance->FvbDevLock));
- //
- EnableFvbWrites (FALSE);
-
- return Status;
-}
-
-EFI_STATUS
-FvbWriteBlock (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- IN UINTN BlockOffset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Writes specified number of bytes from the input buffer to the block
-
-Arguments:
- Instance - The FV instance to be written to
- Lba - The starting logical block index to write to
- BlockOffset - Offset into the block at which to begin writing
- NumBytes - Pointer that on input contains the total size of
- the buffer. On output, it contains the total number
- of bytes actually written
- Buffer - Pointer to a caller allocated buffer that contains
- the source for the write
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - The firmware volume was written successfully
- EFI_BAD_BUFFER_SIZE - Write attempted across a LBA boundary. On output,
- NumBytes contains the total number of bytes
- actually written
- EFI_ACCESS_DENIED - The firmware volume is in the WriteDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be written
- EFI_INVALID_PARAMETER - Instance not found, or NumBytes, Buffer are NULL
-
---*/
-{
- EFI_FVB_ATTRIBUTES Attributes;
- UINTN LbaAddress;
- UINTN LbaWriteAddress;
- UINTN LbaLength;
- EFI_FW_VOL_INSTANCE *FwhInstance;
- EFI_STATUS Status;
- EFI_STATUS ReturnStatus;
-
- //
- // Find the right instance of the FVB private data
- //
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
- ASSERT_EFI_ERROR (Status);
-
- //
- // Writes are enabled in the init routine itself
- //
- if (!FwhInstance->WriteEnabled) {
- return EFI_ACCESS_DENIED;
- }
- //
- // Check for invalid conditions
- //
- if ((NumBytes == NULL) || (Buffer == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (*NumBytes == 0) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = FvbGetLbaAddress (Instance, Lba, &LbaAddress, &LbaWriteAddress, &LbaLength, NULL, Global, Virtual);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Check if the FV is write enabled
- //
- FvbGetVolumeAttributes (Instance, &Attributes, Global, Virtual);
-
- if ((Attributes & EFI_FVB_WRITE_STATUS) == 0) {
- return EFI_ACCESS_DENIED;
- }
- //
- // Perform boundary checks and adjust NumBytes
- //
- if (BlockOffset > LbaLength) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (LbaLength < (*NumBytes + BlockOffset)) {
- *NumBytes = (UINT32) (LbaLength - BlockOffset);
- Status = EFI_BAD_BUFFER_SIZE;
- }
-
- ReturnStatus = FlashFdWrite (
- LbaWriteAddress + BlockOffset,
- LbaAddress,
- NumBytes,
- Buffer,
- LbaLength
- );
- if (EFI_ERROR (ReturnStatus)) {
- return ReturnStatus;
- }
-
- return Status;
-}
-
-EFI_STATUS
-FvbEraseBlock (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Erases and initializes a firmware volume block
-
-Arguments:
- Instance - The FV instance to be erased
- Lba - The logical block index to be erased
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - The erase request was successfully completed
- EFI_ACCESS_DENIED - The firmware volume is in the WriteDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be written. Firmware device may have been
- partially erased
- EFI_INVALID_PARAMETER - Instance not found
-
---*/
-{
-
- EFI_FVB_ATTRIBUTES Attributes;
- UINTN LbaAddress;
- UINTN LbaWriteAddress;
- EFI_FW_VOL_INSTANCE *FwhInstance;
- UINTN LbaLength;
- EFI_STATUS Status;
-
- //
- // Find the right instance of the FVB private data
- //
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
- ASSERT_EFI_ERROR (Status);
-
- //
- // Writes are enabled in the init routine itself
- //
- if (!FwhInstance->WriteEnabled) {
- return EFI_ACCESS_DENIED;
- }
- //
- // Check if the FV is write enabled
- //
- FvbGetVolumeAttributes (Instance, &Attributes, Global, Virtual);
-
- if ((Attributes & EFI_FVB_WRITE_STATUS) == 0) {
- return EFI_ACCESS_DENIED;
- }
- //
- // Get the starting address of the block for erase. For debug reasons,
- // LbaWriteAddress may not be the same as LbaAddress.
- //
- Status = FvbGetLbaAddress (Instance, Lba, &LbaAddress, &LbaWriteAddress, &LbaLength, NULL, Global, Virtual);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return FlashFdErase (
- LbaWriteAddress,
- LbaAddress,
- LbaLength
- );
-}
-
-EFI_STATUS
-FvbEraseCustomBlockRange (
- IN UINTN Instance,
- IN EFI_LBA StartLba,
- IN UINTN OffsetStartLba,
- IN EFI_LBA LastLba,
- IN UINTN OffsetLastLba,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Erases and initializes a specified range of a firmware volume
-
-Arguments:
- Instance - The FV instance to be erased
- StartLba - The starting logical block index to be erased
- OffsetStartLba - Offset into the starting block at which to
- begin erasing
- LastLba - The last logical block index to be erased
- OffsetStartLba - Offset into the last block at which to end erasing
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - The firmware volume was erased successfully
- EFI_ACCESS_DENIED - The firmware volume is in the WriteDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be written. Firmware device may have been
- partially erased
- EFI_INVALID_PARAMETER - Instance not found
-
---*/
-{
- EFI_LBA Index;
- UINTN LbaSize;
- UINTN ScratchLbaSizeData;
-
- //
- // First LBA.
- //
- FvbGetLbaAddress (Instance, StartLba, NULL, NULL, &LbaSize, NULL, Global, Virtual);
-
- //
- // Use the scratch space as the intermediate buffer to transfer data
- // Back up the first LBA in scratch space.
- //
- FvbReadBlock (Instance, StartLba, 0, &LbaSize, Global->FvbScratchSpace[Virtual], Global, Virtual);
-
- //
- // erase now
- //
- FvbEraseBlock (Instance, StartLba, Global, Virtual);
- ScratchLbaSizeData = OffsetStartLba;
-
- //
- // write the data back to the first block
- //
- if (ScratchLbaSizeData > 0) {
- FvbWriteBlock (Instance, StartLba, 0, &ScratchLbaSizeData, Global->FvbScratchSpace[Virtual], Global, Virtual);
- }
- //
- // Middle LBAs
- //
- if (LastLba > (StartLba + 1)) {
- for (Index = (StartLba + 1); Index <= (LastLba - 1); Index++) {
- FvbEraseBlock (Instance, Index, Global, Virtual);
- }
- }
- //
- // Last LBAs, the same as first LBAs
- //
- if (LastLba > StartLba) {
- FvbGetLbaAddress (Instance, LastLba, NULL, NULL, &LbaSize, NULL, Global, Virtual);
- FvbReadBlock (Instance, LastLba, 0, &LbaSize, Global->FvbScratchSpace[Virtual], Global, Virtual);
- FvbEraseBlock (Instance, LastLba, Global, Virtual);
- }
-
- ScratchLbaSizeData = LbaSize - (OffsetStartLba + 1);
-
- return FvbWriteBlock (
- Instance,
- LastLba,
- (OffsetLastLba + 1),
- &ScratchLbaSizeData,
- Global->FvbScratchSpace[Virtual],
- Global,
- Virtual
- );
-}
-
-EFI_STATUS
-FvbSetVolumeAttributes (
- IN UINTN Instance,
- IN OUT EFI_FVB_ATTRIBUTES *Attributes,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-/*++
-
-Routine Description:
- Modifies the current settings of the firmware volume according to the
- input parameter, and returns the new setting of the volume
-
-Arguments:
- Instance - The FV instance whose attributes is going to be
- modified
- Attributes - On input, it is a pointer to EFI_FVB_ATTRIBUTES
- containing the desired firmware volume settings.
- On successful return, it contains the new settings
- of the firmware volume
- Global - Pointer to ESAL_FWB_GLOBAL that contains all
- instance data
- Virtual - Whether CPU is in virtual or physical mode
-
-Returns:
- EFI_SUCCESS - Successfully returns
- EFI_ACCESS_DENIED - The volume setting is locked and cannot be modified
- EFI_INVALID_PARAMETER - Instance not found, or The attributes requested are
- in conflict with the capabilities as declared in the
- firmware volume header
-
---*/
-{
- EFI_FW_VOL_INSTANCE *FwhInstance;
- EFI_FVB_ATTRIBUTES OldAttributes;
- EFI_FVB_ATTRIBUTES *AttribPtr;
- UINT32 Capabilities;
- UINT32 OldStatus;
- UINT32 NewStatus;
- EFI_STATUS Status;
-
- //
- // Find the right instance of the FVB private data
- //
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
- ASSERT_EFI_ERROR (Status);
-
- AttribPtr = (EFI_FVB_ATTRIBUTES *) &(FwhInstance->VolumeHeader.Attributes);
- OldAttributes = *AttribPtr;
- Capabilities = OldAttributes & EFI_FVB_CAPABILITIES;
- OldStatus = OldAttributes & EFI_FVB_STATUS;
- NewStatus = *Attributes & EFI_FVB_STATUS;
-
- //
- // If firmware volume is locked, no status bit can be updated
- //
- if (OldAttributes & EFI_FVB_LOCK_STATUS) {
- if (OldStatus ^ NewStatus) {
- return EFI_ACCESS_DENIED;
- }
- }
- //
- // Test read disable
- //
- if ((Capabilities & EFI_FVB_READ_DISABLED_CAP) == 0) {
- if ((NewStatus & EFI_FVB_READ_STATUS) == 0) {
- return EFI_INVALID_PARAMETER;
- }
- }
- //
- // Test read enable
- //
- if ((Capabilities & EFI_FVB_READ_ENABLED_CAP) == 0) {
- if (NewStatus & EFI_FVB_READ_STATUS) {
- return EFI_INVALID_PARAMETER;
- }
- }
- //
- // Test write disable
- //
- if ((Capabilities & EFI_FVB_WRITE_DISABLED_CAP) == 0) {
- if ((NewStatus & EFI_FVB_WRITE_STATUS) == 0) {
- return EFI_INVALID_PARAMETER;
- }
- }
- //
- // Test write enable
- //
- if ((Capabilities & EFI_FVB_WRITE_ENABLED_CAP) == 0) {
- if (NewStatus & EFI_FVB_WRITE_STATUS) {
- return EFI_INVALID_PARAMETER;
- }
- }
- //
- // Test lock
- //
- if ((Capabilities & EFI_FVB_LOCK_CAP) == 0) {
- if (NewStatus & EFI_FVB_LOCK_STATUS) {
- return EFI_INVALID_PARAMETER;
- }
- }
-
- *AttribPtr = (*AttribPtr) & (0xFFFFFFFF & (~EFI_FVB_STATUS));
- *AttribPtr = (*AttribPtr) | NewStatus;
- *Attributes = *AttribPtr;
-
- return EFI_SUCCESS;
-}
-//
-// FVB protocol APIs
-//
-EFI_STATUS
-EFIAPI
-FvbProtocolGetPhysicalAddress (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_PHYSICAL_ADDRESS *Address
- )
-/*++
-
-Routine Description:
-
- Retrieves the physical address of the device.
-
-Arguments:
-
- This - Calling context
- Address - Output buffer containing the address.
-
-Returns:
-
-Returns:
- EFI_SUCCESS - Successfully returns
-
---*/
-{
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
-
- FvbDevice = FVB_DEVICE_FROM_THIS (This);
-
- return FvbGetPhysicalAddress (FvbDevice->Instance, Address, mFvbModuleGlobal, EfiGoneVirtual ());
-}
-
-EFI_STATUS
-EFIAPI
-FvbProtocolGetBlockSize (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN EFI_LBA Lba,
- OUT UINTN *BlockSize,
- OUT UINTN *NumOfBlocks
- )
-/*++
-
-Routine Description:
- Retrieve the size of a logical block
-
-Arguments:
- This - Calling context
- Lba - Indicates which block to return the size for.
- BlockSize - A pointer to a caller allocated UINTN in which
- the size of the block is returned
- NumOfBlocks - a pointer to a caller allocated UINTN in which the
- number of consecutive blocks starting with Lba is
- returned. All blocks in this range have a size of
- BlockSize
-
-Returns:
- EFI_SUCCESS - The firmware volume was read successfully and
- contents are in Buffer
-
---*/
-{
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
-
- FvbDevice = FVB_DEVICE_FROM_THIS (This);
-
- return FvbGetLbaAddress (
- FvbDevice->Instance,
- Lba,
- NULL,
- NULL,
- BlockSize,
- NumOfBlocks,
- mFvbModuleGlobal,
- EfiGoneVirtual ()
- );
-}
-
-EFI_STATUS
-EFIAPI
-FvbProtocolGetAttributes (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_FVB_ATTRIBUTES *Attributes
- )
-/*++
-
-Routine Description:
- Retrieves Volume attributes. No polarity translations are done.
-
-Arguments:
- This - Calling context
- Attributes - output buffer which contains attributes
-
-Returns:
- EFI_SUCCESS - Successfully returns
-
---*/
-{
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
-
- FvbDevice = FVB_DEVICE_FROM_THIS (This);
-
- return FvbGetVolumeAttributes (FvbDevice->Instance, Attributes, mFvbModuleGlobal, EfiGoneVirtual ());
-}
-
-EFI_STATUS
-EFIAPI
-FvbProtocolSetAttributes (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN OUT EFI_FVB_ATTRIBUTES *Attributes
- )
-/*++
-
-Routine Description:
- Sets Volume attributes. No polarity translations are done.
-
-Arguments:
- This - Calling context
- Attributes - output buffer which contains attributes
-
-Returns:
- EFI_SUCCESS - Successfully returns
-
---*/
-{
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
-
- FvbDevice = FVB_DEVICE_FROM_THIS (This);
-
- return FvbSetVolumeAttributes (FvbDevice->Instance, Attributes, mFvbModuleGlobal, EfiGoneVirtual ());
-}
-
-EFI_STATUS
-EFIAPI
-FvbProtocolEraseBlocks (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- ...
- )
-/*++
-
-Routine Description:
-
- The EraseBlock() function erases one or more blocks as denoted by the
- variable argument list. The entire parameter list of blocks must be verified
- prior to erasing any blocks. If a block is requested that does not exist
- within the associated firmware volume (it has a larger index than the last
- block of the firmware volume), the EraseBlock() function must return
- EFI_INVALID_PARAMETER without modifying the contents of the firmware volume.
-
-Arguments:
- This - Calling context
- ... - Starting LBA followed by Number of Lba to erase.
- a -1 to terminate the list.
-
-Returns:
- EFI_SUCCESS - The erase request was successfully completed
- EFI_ACCESS_DENIED - The firmware volume is in the WriteDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be written. Firmware device may have been
- partially erased
-
---*/
-{
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
- EFI_FW_VOL_INSTANCE *FwhInstance;
- UINTN NumOfBlocks;
- VA_LIST args;
- EFI_LBA StartingLba;
- UINTN NumOfLba;
- EFI_STATUS Status;
-
- FvbDevice = FVB_DEVICE_FROM_THIS (This);
-
- Status = GetFvbInstance (FvbDevice->Instance, mFvbModuleGlobal, &FwhInstance, EfiGoneVirtual ());
- ASSERT_EFI_ERROR (Status);
-
- NumOfBlocks = FwhInstance->NumOfBlocks;
-
- VA_START (args, This);
-
- do {
- StartingLba = VA_ARG (args, EFI_LBA);
- if (StartingLba == EFI_LBA_LIST_TERMINATOR) {
- break;
- }
-
- NumOfLba = VA_ARG (args, UINT32);
-
- //
- // Check input parameters
- //
- if ((NumOfLba == 0) || ((StartingLba + NumOfLba) > NumOfBlocks)) {
- VA_END (args);
- return EFI_INVALID_PARAMETER;
- }
- } while (1);
-
- VA_END (args);
-
- VA_START (args, This);
- do {
- StartingLba = VA_ARG (args, EFI_LBA);
- if (StartingLba == EFI_LBA_LIST_TERMINATOR) {
- break;
- }
-
- NumOfLba = VA_ARG (args, UINT32);
-
- while (NumOfLba > 0) {
- Status = FvbEraseBlock (FvbDevice->Instance, StartingLba, mFvbModuleGlobal, EfiGoneVirtual ());
- if (EFI_ERROR (Status)) {
- VA_END (args);
- return Status;
- }
-
- StartingLba++;
- NumOfLba--;
- }
-
- } while (1);
-
- VA_END (args);
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-FvbProtocolWrite (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN EFI_LBA Lba,
- IN UINTN Offset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer
- )
-/*++
-
-Routine Description:
-
- Writes data beginning at Lba:Offset from FV. The write terminates either
- when *NumBytes of data have been written, or when a block boundary is
- reached. *NumBytes is updated to reflect the actual number of bytes
- written. The write opertion does not include erase. This routine will
- attempt to write only the specified bytes. If the writes do not stick,
- it will return an error.
-
-Arguments:
- This - Calling context
- Lba - Block in which to begin write
- Offset - Offset in the block at which to begin write
- NumBytes - On input, indicates the requested write size. On
- output, indicates the actual number of bytes written
- Buffer - Buffer containing source data for the write.
-
-Returns:
- EFI_SUCCESS - The firmware volume was written successfully
- EFI_BAD_BUFFER_SIZE - Write attempted across a LBA boundary. On output,
- NumBytes contains the total number of bytes
- actually written
- EFI_ACCESS_DENIED - The firmware volume is in the WriteDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be written
- EFI_INVALID_PARAMETER - NumBytes or Buffer are NULL
-
---*/
-{
-
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
-
- FvbDevice = FVB_DEVICE_FROM_THIS (This);
-
- return FvbWriteBlock (FvbDevice->Instance, Lba, Offset, NumBytes, Buffer, mFvbModuleGlobal, EfiGoneVirtual ());
-}
-
-EFI_STATUS
-EFIAPI
-FvbProtocolRead (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN EFI_LBA Lba,
- IN UINTN Offset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer
- )
-/*++
-
-Routine Description:
-
- Reads data beginning at Lba:Offset from FV. The Read terminates either
- when *NumBytes of data have been read, or when a block boundary is
- reached. *NumBytes is updated to reflect the actual number of bytes
- written. The write opertion does not include erase. This routine will
- attempt to write only the specified bytes. If the writes do not stick,
- it will return an error.
-
-Arguments:
- This - Calling context
- Lba - Block in which to begin Read
- Offset - Offset in the block at which to begin Read
- NumBytes - On input, indicates the requested write size. On
- output, indicates the actual number of bytes Read
- Buffer - Buffer containing source data for the Read.
-
-Returns:
- EFI_SUCCESS - The firmware volume was read successfully and
- contents are in Buffer
- EFI_BAD_BUFFER_SIZE - Read attempted across a LBA boundary. On output,
- NumBytes contains the total number of bytes returned
- in Buffer
- EFI_ACCESS_DENIED - The firmware volume is in the ReadDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be read
- EFI_INVALID_PARAMETER - NumBytes or Buffer are NULL
-
---*/
-{
-
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
-
- FvbDevice = FVB_DEVICE_FROM_THIS (This);
-
- return FvbReadBlock (FvbDevice->Instance, Lba, Offset, NumBytes, Buffer, mFvbModuleGlobal, EfiGoneVirtual ());
-}
-//
-// FVB Extension Protocols
-//
-EFI_STATUS
-EFIAPI
-FvbExtendProtocolEraseCustomBlockRange (
- IN EFI_FVB_EXTENSION_PROTOCOL *This,
- IN EFI_LBA StartLba,
- IN UINTN OffsetStartLba,
- IN EFI_LBA LastLba,
- IN UINTN OffsetLastLba
- )
-/*++
-
-Routine Description:
- Erases and initializes a specified range of a firmware volume
-
-Arguments:
- This - Calling context
- StartLba - The starting logical block index to be erased
- OffsetStartLba - Offset into the starting block at which to
- begin erasing
- LastLba - The last logical block index to be erased
- OffsetStartLba - Offset into the last block at which to end erasing
-
-Returns:
- EFI_SUCCESS - The firmware volume was erased successfully
- EFI_ACCESS_DENIED - The firmware volume is in the WriteDisabled state
- EFI_DEVICE_ERROR - The block device is not functioning correctly and
- could not be written. Firmware device may have been
- partially erased
-
---*/
-{
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
-
- FvbDevice = FVB_EXTEND_DEVICE_FROM_THIS (This);
-
- return FvbEraseCustomBlockRange (
- FvbDevice->Instance,
- StartLba,
- OffsetStartLba,
- LastLba,
- OffsetLastLba,
- mFvbModuleGlobal,
- EfiGoneVirtual ()
- );
-}
-
-STATIC
-EFI_STATUS
-ValidateFvHeader (
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
- )
-/*++
-
-Routine Description:
- Check the integrity of firmware volume header
-
-Arguments:
- FwVolHeader - A pointer to a firmware volume header
-
-Returns:
- EFI_SUCCESS - The firmware volume is consistent
- EFI_NOT_FOUND - The firmware volume has corrupted. So it is not an FV
-
---*/
-{
- UINT16 *Ptr;
- UINT16 HeaderLength;
- UINT16 Checksum;
-
- //
- // Verify the header revision, header signature, length
- // Length of FvBlock cannot be 2**64-1
- // HeaderLength cannot be an odd number
- //
- if ((FwVolHeader->Revision != EFI_FVH_REVISION) ||
- (FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||
- (FwVolHeader->FvLength == ((UINTN) -1)) ||
- ((FwVolHeader->HeaderLength & 0x01) != 0)
- ) {
- return EFI_NOT_FOUND;
- }
- //
- // Verify the header checksum
- //
- HeaderLength = (UINT16) (FwVolHeader->HeaderLength / 2);
- Ptr = (UINT16 *) FwVolHeader;
- Checksum = 0;
- while (HeaderLength > 0) {
- Checksum = *Ptr++;
- HeaderLength--;
- }
-
- if (Checksum != 0) {
- return EFI_NOT_FOUND;
- }
-
- return EFI_SUCCESS;
-}
-
-BOOLEAN
-FvbGetCfiSupported (
- IN UINTN LbaAddress
- )
-/*++
-
-Routine Description:
- Check if the firmware volume is CFI typed flash
-
-Arguments:
- LbaAddress - The physical address of the firmware volume
-
-Returns:
- TRUE - CFI supported
- FALSE - CFI un-supported
-
---*/
-{
- UINT8 HubData[8];
- UINT8 HubCommand;
- BOOLEAN Supported;
-
- Supported = TRUE;
-
- //
- // Issue CFI Query (98h) to address 55h
- //
- HubCommand = CFI_QUERY;
- FvbMemWrite8 ((LbaAddress + 0x55), HubCommand);
- //
- // x8 device in 8-bit mode?
- //
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress + 0x10), 0x3, &HubData);
- if (!EfiCompareMem (HubData, "QRY", 3)) {
- goto Done;
- }
- //
- // paired x8 devices?
- //
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress + 0x20), 0x6, &HubData);
- if (!EfiCompareMem (HubData, "QQRRYY", 6)) {
- goto Done;
- }
- //
- // x16 device in 16-bit mode?
- //
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress + 0x20), 0x4, &HubData);
- if ((!EfiCompareMem (&HubData[0], "R", 2)) && (!EfiCompareMem (&HubData[2], "Q", 2))) {
- goto Done;
- }
- //
- // x16 device in 8-bit mode?
- //
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress + 0x20), 0x3, &HubData);
- if (!EfiCompareMem (HubData, "QQR", 3)) {
- goto Done;
- }
- //
- // 2 x16 devices in 8-bit mode (paired chip configuration)?
- //
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress + 0x40), 0x6, &HubData);
- if (!EfiCompareMem (HubData, "QQQQRR", 6)) {
- goto Done;
- }
- //
- // x32 device in 8-bit mode
- //
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress + 0x40), 0x5, &HubData);
- if (!EfiCompareMem (HubData, "QQQQR", 5)) {
- goto Done;
- }
- //
- // x32 device in 32-bit mode
- //
- if ((!EfiCompareMem (&HubData[0], "R", 2)) && (((UINT16) HubData[2]) == 0) && (HubData[4] == 'Q')) {
- goto Done;
- }
- //
- // If it got to here, CFI is not supported
- //
- Supported = FALSE;
-
-Done:
- //
- // Bug Fix #4071:
- // Issue command FWH_READ_ARRAY_COMMAND (0xff) at the end of this service to
- // guarantee that the FWH is back in read mode again
- //
- HubCommand = FWH_READ_ARRAY_COMMAND;
- FvbMemWrite8 (LbaAddress, HubCommand);
-
- return Supported;
-}
-
-EFI_STATUS
-GetFvbHeader (
- VOID **HobList,
- EFI_FIRMWARE_VOLUME_HEADER **FwVolHeader,
- EFI_PHYSICAL_ADDRESS *BaseAddress,
- BOOLEAN *WriteBack
- )
-{
- EFI_STATUS Status;
- VOID *Buffer;
- EFI_FLASH_MAP_ENTRY_DATA *FlashMapEntry;
- EFI_FLASH_SUBAREA_ENTRY *FlashMapSubEntry;
-
- Status = EFI_SUCCESS;
- *FwVolHeader = NULL;
- *WriteBack = FALSE;
-
- Status = GetNextGuidHob (HobList, &gEfiFlashMapHobGuid, &Buffer, NULL);
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
-
- FlashMapEntry = (EFI_FLASH_MAP_ENTRY_DATA *) Buffer;
- FlashMapSubEntry = &FlashMapEntry->Entries[0];
- //
- // Check if it is a "FVB" area
- //
- if (!EfiCompareGuid (&FlashMapSubEntry->FileSystem, &gEfiFirmwareVolumeBlockProtocolGuid)) {
- return Status;
- }
- //
- // Check if it is a "real" flash
- //
- if (FlashMapSubEntry->Attributes != (EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV)) {
- return Status;
- }
-
- *BaseAddress = FlashMapSubEntry->Base;
- DEBUG ((EFI_D_ERROR, "FlashMap HOB: BaseAddress = 0x%lx\n", *BaseAddress));
-
- *FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (*BaseAddress);
- Status = ValidateFvHeader (*FwVolHeader);
- if (EFI_ERROR (Status)) {
- //
- // Get FvbInfo
- //
- *WriteBack = TRUE;
- DEBUG ((EFI_D_ERROR, "BaseAddress = 0x%lx\n", BaseAddress));
- Status = GetFvbInfo (*BaseAddress, FwVolHeader);
- DEBUG ((EFI_D_ERROR, "Fvb: FV header invalid, GetFvbInfo - %r\n", Status));
- ASSERT_EFI_ERROR (Status);
- }
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-FvbInitialize (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-/*++
-
-Routine Description:
- This function does common initialization for FVB services
-
-Arguments:
-
-Returns:
-
---*/
-{
- EFI_STATUS Status;
- EFI_FW_VOL_INSTANCE *FwhInstance;
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
- VOID *HobList;
- VOID *FirmwareVolumeHobList;
- UINT32 BufferSize;
- EFI_FV_BLOCK_MAP_ENTRY *PtrBlockMapEntry;
- UINTN LbaAddress;
- UINT8 Data;
- UINTN BlockIndex2;
- BOOLEAN WriteEnabled;
- BOOLEAN WriteLocked;
- EFI_HANDLE FwbHandle;
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *OldFwbInterface;
- EFI_DEVICE_PATH_PROTOCOL *TempFwbDevicePath;
- FV_DEVICE_PATH TempFvbDevicePathData;
- UINT32 MaxLbaSize;
- BOOLEAN CfiEnabled;
- EFI_PHYSICAL_ADDRESS BaseAddress;
- BOOLEAN WriteBack;
- UINTN NumOfBlocks;
- UINTN HeaderLength;
-
- INITIALIZE_SCRIPT (ImageHandle, SystemTable);
-
- EfiInitializeRuntimeDriverLib (ImageHandle, SystemTable, FvbVirtualddressChangeEvent);
-
- Status = EfiGetSystemConfigurationTable (&gEfiHobListGuid, &HobList);
- HeaderLength = 0;
- //
- // No FV HOBs found
- //
- ASSERT_EFI_ERROR (Status);
-
- //
- // Allocate runtime services data for global variable, which contains
- // the private data of all firmware volume block instances
- //
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- sizeof (ESAL_FWB_GLOBAL),
- &mFvbModuleGlobal
- );
- ASSERT_EFI_ERROR (Status);
-
- EnablePlatformFvb ();
- EnableFvbWrites (TRUE);
-
- //
- // Calculate the total size for all firmware volume block instances
- //
- BufferSize = 0;
- FirmwareVolumeHobList = HobList;
- do {
- Status = GetFvbHeader (&FirmwareVolumeHobList, &FwVolHeader, &BaseAddress, &WriteBack);
- if (EFI_ERROR (Status)) {
- break;
- }
-
- if (FwVolHeader) {
- BufferSize += (FwVolHeader->HeaderLength + sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER));
- }
- } while (TRUE);
-
- //
- // Only need to allocate once. There is only one copy of physical memory for
- // the private data of each FV instance. But in virtual mode or in physical
- // mode, the address of the the physical memory may be different.
- //
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- BufferSize,
- &mFvbModuleGlobal->FvInstance[FVB_PHYSICAL]
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Make a virtual copy of the FvInstance pointer.
- //
- FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
- mFvbModuleGlobal->FvInstance[FVB_VIRTUAL] = FwhInstance;
-
- mFvbModuleGlobal->NumFv = 0;
- FirmwareVolumeHobList = HobList;
-
- MaxLbaSize = 0;
-
- //
- // Fill in the private data of each firmware volume block instance
- //
- do {
- Status = GetFvbHeader (&FirmwareVolumeHobList, &FwVolHeader, &BaseAddress, &WriteBack);
- if (EFI_ERROR (Status)) {
- break;
- }
-
- if (!FwVolHeader) {
- continue;
- }
-
- EfiCopyMem ((UINTN *) &(FwhInstance->VolumeHeader), (UINTN *) FwVolHeader, FwVolHeader->HeaderLength);
- FwVolHeader = &(FwhInstance->VolumeHeader);
-
- FwhInstance->FvBase[FVB_PHYSICAL] = (UINTN) BaseAddress;
- FwhInstance->FvBase[FVB_VIRTUAL] = (UINTN) BaseAddress;
-
- //
- // FwhInstance->FvWriteBase may not be the same as FwhInstance->FvBase
- //
- PlatformGetFvbWriteBase (
- (UINTN) BaseAddress,
- (UINTN *) &(FwhInstance->FvWriteBase[FVB_PHYSICAL]),
- &WriteEnabled
- );
- //
- // Every pointer should have a virtual copy.
- //
- FwhInstance->FvWriteBase[FVB_VIRTUAL] = FwhInstance->FvWriteBase[FVB_PHYSICAL];
-
- FwhInstance->WriteEnabled = WriteEnabled;
- EfiInitializeLock (&(FwhInstance->FvbDevLock), EFI_TPL_HIGH_LEVEL);
-
- LbaAddress = (UINTN) FwhInstance->FvWriteBase[0];
- NumOfBlocks = 0;
- WriteLocked = FALSE;
-
- if (WriteEnabled) {
- CfiEnabled = FvbGetCfiSupported (LbaAddress);
- for (PtrBlockMapEntry = FwVolHeader->FvBlockMap; PtrBlockMapEntry->NumBlocks != 0; PtrBlockMapEntry++) {
-
- for (BlockIndex2 = 0; BlockIndex2 < PtrBlockMapEntry->NumBlocks; BlockIndex2++) {
-
- if (SetPlatformFvbLock (LbaAddress)) {
- //
- // Clear all write-lock and read-lock HW bits
- // For sync3, the software will enforce the protection
- //
- if (CfiEnabled) {
- Data = CFI_BLOCK_LOCK_UNLOCK;
- FvbMemWrite8 (LbaAddress, Data);
- Data = CFI_BLOCK_UNLOCK_CONFIRM;
- FvbMemWrite8 (LbaAddress, Data);
- while (TRUE) {
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress + 2), 1, &Data);
- if (Data & 0x80) {
- break;
- }
- }
-
- Data = FWH_READ_ARRAY_COMMAND;
- FvbMemWrite8 (LbaAddress, Data);
- } else {
- EfiMemRead (EfiCpuIoWidthUint8, (LbaAddress - 0x400000 + 2), 0x1, &Data);
- //
- // bugbug: lock down is block based, not FV based. Here we assume that
- // the FV is locked if one of its block is locked
- //
- if ((Data & FWH_WRITE_LOCK) && (Data & FWH_LOCK_DOWN)) {
- //
- // the flash is locked and locked down
- //
- WriteLocked = TRUE;
- } else {
- Data &= ~(FWH_WRITE_LOCK | FWH_READ_LOCK | FWH_LOCK_DOWN);
-
- //
- // Save boot script for S3 resume
- //
- SCRIPT_MEM_WRITE (
- EFI_ACPI_S3_RESUME_SCRIPT_TABLE,
- EfiBootScriptWidthUint8,
- (UINT64) (LbaAddress - 0x400000 + 2),
- 1,
- &Data
- );
-
- FvbMemWrite8 ((LbaAddress - 0x400000 + 2), Data);
- }
- }
- }
-
- LbaAddress += PtrBlockMapEntry->BlockLength;
- }
- //
- // Get the maximum size of a block. The size will be used to allocate
- // buffer for Scratch space, the intermediate buffer for FVB extension
- // protocol
- //
- if (MaxLbaSize < PtrBlockMapEntry->BlockLength) {
- MaxLbaSize = PtrBlockMapEntry->BlockLength;
- }
-
- NumOfBlocks = NumOfBlocks + PtrBlockMapEntry->NumBlocks;
- }
- //
- // Write back a healthy FV header
- //
- if (WriteBack && (!WriteLocked)) {
- Status = FlashFdErase (
- (UINTN) FwhInstance->FvWriteBase[0],
- (UINTN) BaseAddress,
- FwVolHeader->FvBlockMap->BlockLength
- );
-
- HeaderLength = (UINTN) FwVolHeader->HeaderLength;
- Status = FlashFdWrite (
- (UINTN) FwhInstance->FvWriteBase[0],
- (UINTN) BaseAddress,
- (UINTN *) &HeaderLength,
- (UINT8 *) FwVolHeader,
- FwVolHeader->FvBlockMap->BlockLength
- );
-
- FwVolHeader->HeaderLength = (UINT16) HeaderLength;
- DEBUG ((EFI_D_ERROR, "Fvb: FV header invalid, write back - %r\n", Status));
- }
- }
- //
- // The total number of blocks in the FV.
- //
- FwhInstance->NumOfBlocks = NumOfBlocks;
-
- //
- // If the FV is write locked, set the appropriate attributes
- //
- if (WriteLocked) {
- //
- // write disabled
- //
- FwhInstance->VolumeHeader.Attributes &= ~EFI_FVB_WRITE_STATUS;
- //
- // lock enabled
- //
- FwhInstance->VolumeHeader.Attributes |= EFI_FVB_LOCK_STATUS;
- }
- //
- // Add a FVB Protocol Instance
- //
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- sizeof (EFI_FW_VOL_BLOCK_DEVICE),
- &FvbDevice
- );
- ASSERT_EFI_ERROR (Status);
-
- EfiCopyMem (FvbDevice, &mFvbDeviceTemplate, sizeof (EFI_FW_VOL_BLOCK_DEVICE));
-
- FvbDevice->Instance = mFvbModuleGlobal->NumFv;
- mFvbModuleGlobal->NumFv++;
-
- //
- // Set up the devicepath
- //
- FvbDevice->DevicePath.MemMapDevPath.StartingAddress = BaseAddress;
- FvbDevice->DevicePath.MemMapDevPath.EndingAddress = BaseAddress + (FwVolHeader->FvLength - 1);
-
- //
- // Find a handle with a matching device path that has supports FW Block protocol
- //
- TempFwbDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) &TempFvbDevicePathData;
- EfiCopyMem (TempFwbDevicePath, &FvbDevice->DevicePath, sizeof (FV_DEVICE_PATH));
- Status = gBS->LocateDevicePath (&gEfiFirmwareVolumeBlockProtocolGuid, &TempFwbDevicePath, &FwbHandle);
- if (EFI_ERROR (Status)) {
- //
- // LocateDevicePath fails so install a new interface and device path
- //
- FwbHandle = NULL;
- Status = gBS->InstallMultipleProtocolInterfaces (
- &FwbHandle,
- &gEfiFirmwareVolumeBlockProtocolGuid,
- &FvbDevice->FwVolBlockInstance,
- &gEfiDevicePathProtocolGuid,
- &FvbDevice->DevicePath,
- NULL
- );
- ASSERT_EFI_ERROR (Status);
- } else if (EfiIsDevicePathEnd (TempFwbDevicePath)) {
- //
- // Device allready exists, so reinstall the FVB protocol
- //
- Status = gBS->HandleProtocol (
- FwbHandle,
- &gEfiFirmwareVolumeBlockProtocolGuid,
- &OldFwbInterface
- );
- ASSERT_EFI_ERROR (Status);
-
- Status = gBS->ReinstallProtocolInterface (
- FwbHandle,
- &gEfiFirmwareVolumeBlockProtocolGuid,
- OldFwbInterface,
- &FvbDevice->FwVolBlockInstance
- );
- ASSERT_EFI_ERROR (Status);
-
- } else {
- //
- // There was a FVB protocol on an End Device Path node
- //
- ASSERT (FALSE);
- }
- //
- // Install FVB Extension Protocol on the same handle
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &FwbHandle,
- &gEfiFvbExtensionProtocolGuid,
- &FvbDevice->FvbExtension,
- &gEfiAlternateFvBlockGuid,
- NULL,
- NULL
- );
-
- ASSERT_EFI_ERROR (Status);
-
- FwhInstance = (EFI_FW_VOL_INSTANCE *)
- (
- (UINTN) ((UINT8 *) FwhInstance) + FwVolHeader->HeaderLength +
- (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))
- );
- } while (TRUE);
-
- //
- // Allocate for scratch space, an intermediate buffer for FVB extention
- //
- Status = gBS->AllocatePool (
- EfiRuntimeServicesData,
- MaxLbaSize,
- &mFvbModuleGlobal->FvbScratchSpace[FVB_PHYSICAL]
- );
- ASSERT_EFI_ERROR (Status);
-
- mFvbModuleGlobal->FvbScratchSpace[FVB_VIRTUAL] = mFvbModuleGlobal->FvbScratchSpace[FVB_PHYSICAL];
-
- FvbSpecificInitialize (mFvbModuleGlobal);
-
- return EnableFvbWrites (FALSE);
-}
diff --git a/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FwBlockService.h b/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FwBlockService.h
deleted file mode 100644
index 1fad9bd6ba..0000000000
--- a/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/FwBlockService.h
+++ /dev/null
@@ -1,324 +0,0 @@
-/*++
-
-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:
-
- FwBlockService.h
-
-Abstract:
-
- Firmware volume block driver for Intel Firmware Hub (FWH) device
-
---*/
-
-#ifndef _FW_BLOCK_SERVICE_H
-#define _FW_BLOCK_SERVICE_H
-
-//
-// Statements that include other header files
-//
-#include "Tiano.h"
-#include "EfiFirmwareVolumeHeader.h"
-#include "EfiRuntimeLib.h"
-#include "EfiHobLib.h"
-#include "EfiScriptLib.h"
-
-#include EFI_PROTOCOL_PRODUCER (FirmwareVolumeBlock)
-#include EFI_PROTOCOL_PRODUCER (FvbExtension)
-#include EFI_GUID_DEFINITION (AlternateFvBlock)
-#include EFI_GUID_DEFINITION (Hob)
-#include EFI_GUID_DEFINITION (DxeServices)
-#include EFI_PROTOCOL_CONSUMER (CpuIo)
-
-#define FVB_MAX_RETRY_TIMES 10000000
-#define FWH_BLOCK_ERASE_SETUP_COMMAND 0x20
-#define FWH_BLOCK_ERASE_CONFIRM_COMMAND 0xd0
-#define FWH_READ_STATUS_COMMAND 0x70
-#define FWH_CLEAR_STATUS_COMMAND 0x50
-#define FWH_READ_ARRAY_COMMAND 0xff
-#define FWH_WRITE_SETUP_COMMAND 0x40
-#define FWH_OPEN_FEATURE_SPACE_COMMAND 0x91
-#define FWH_READ_LOCK (1 << 2)
-#define FWH_WRITE_LOCK (1 << 1)
-#define FWH_LOCK_DOWN 1
-#define FWH_WRITE_STATE_STATUS (1 << 7)
-#define FWH_ERASE_STATUS (1 << 5)
-#define FWH_PROGRAM_STATUS (1 << 4)
-#define FWH_VPP_STATUS (1 << 3)
-#define STALL_TIME 5
-#define FWH_ERASE_STATUS_BITS (FWH_ERASE_STATUS || FWH_VPP_STATUS)
-#define FWH_WRITE_STATUS_BITS (FWH_WRITE_STATUS || FWH_VPP_STATUS)
-#define CFI_BLOCK_LOCK_UNLOCK 0x60
-#define CFI_BLOCK_LOCK_CONFIRM 1
-#define CFI_BLOCK_UNLOCK_CONFIRM 0xD0
-#define CFI_QUERY 0x98
-
-//
-// BugBug: Add documentation here for data structure!!!!
-//
-#define FVB_PHYSICAL 0
-#define FVB_VIRTUAL 1
-
-typedef struct {
- EFI_LOCK FvbDevLock;
- UINTN FvBase[2];
- UINTN FvWriteBase[2];
- UINTN NumOfBlocks;
- BOOLEAN WriteEnabled;
- EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;
-} EFI_FW_VOL_INSTANCE;
-
-typedef struct {
- UINT32 NumFv;
- EFI_FW_VOL_INSTANCE *FvInstance[2];
- UINT8 *FvbScratchSpace[2];
-} ESAL_FWB_GLOBAL;
-
-//
-// Fvb Protocol instance data
-//
-#define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
-#define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
-#define FVB_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('F', 'V', 'B', 'C')
-
-typedef struct {
- MEMMAP_DEVICE_PATH MemMapDevPath;
- EFI_DEVICE_PATH_PROTOCOL EndDevPath;
-} FV_DEVICE_PATH;
-
-typedef struct {
- UINTN Signature;
- FV_DEVICE_PATH DevicePath;
- UINTN Instance;
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
- EFI_FVB_EXTENSION_PROTOCOL FvbExtension;
-} EFI_FW_VOL_BLOCK_DEVICE;
-
-EFI_STATUS
-GetFvbInfo (
- IN EFI_PHYSICAL_ADDRESS FvBaseAddress,
- OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
- )
-;
-
-EFI_STATUS
-EnableFvbWrites (
- IN BOOLEAN EnableWrites
- )
-;
-
-EFI_STATUS
-PlatformGetFvbWriteBase (
- IN UINTN CurrentBaseAddress,
- IN UINTN *NewBaseAddress,
- IN BOOLEAN *WriteEnabled
- )
-;
-
-EFI_STATUS
-EnablePlatformFvb (
- VOID
- )
-;
-
-BOOLEAN
-SetPlatformFvbLock (
- IN UINTN LbaAddress
- )
-;
-
-EFI_STATUS
-FvbReadBlock (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- IN UINTN BlockOffset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-EFI_STATUS
-FvbWriteBlock (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- IN UINTN BlockOffset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-EFI_STATUS
-FvbEraseBlock (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-EFI_STATUS
-FvbSetVolumeAttributes (
- IN UINTN Instance,
- IN OUT EFI_FVB_ATTRIBUTES *Attributes,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-EFI_STATUS
-FvbGetVolumeAttributes (
- IN UINTN Instance,
- OUT EFI_FVB_ATTRIBUTES *Attributes,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-EFI_STATUS
-FvbGetPhysicalAddress (
- IN UINTN Instance,
- OUT EFI_PHYSICAL_ADDRESS *Address,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbInitialize (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-;
-
-
-VOID
-EFIAPI
-FvbClassAddressChangeEvent (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-;
-
-EFI_STATUS
-FvbSpecificInitialize (
- IN ESAL_FWB_GLOBAL *mFvbModuleGlobal
- )
-;
-
-EFI_STATUS
-FvbGetLbaAddress (
- IN UINTN Instance,
- IN EFI_LBA Lba,
- OUT UINTN *LbaAddress,
- OUT UINTN *LbaWriteAddress,
- OUT UINTN *LbaLength,
- OUT UINTN *NumOfBlocks,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-EFI_STATUS
-FvbEraseCustomBlockRange (
- IN UINTN Instance,
- IN EFI_LBA StartLba,
- IN UINTN OffsetStartLba,
- IN EFI_LBA LastLba,
- IN UINTN OffsetLastLba,
- IN ESAL_FWB_GLOBAL *Global,
- IN BOOLEAN Virtual
- )
-;
-
-//
-// Protocol APIs
-//
-EFI_STATUS
-EFIAPI
-FvbProtocolGetAttributes (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_FVB_ATTRIBUTES *Attributes
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbProtocolSetAttributes (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN OUT EFI_FVB_ATTRIBUTES *Attributes
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbProtocolGetPhysicalAddress (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- OUT EFI_PHYSICAL_ADDRESS *Address
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbProtocolGetBlockSize (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN EFI_LBA Lba,
- OUT UINTN *BlockSize,
- OUT UINTN *NumOfBlocks
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbProtocolRead (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN EFI_LBA Lba,
- IN UINTN Offset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbProtocolWrite (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- IN EFI_LBA Lba,
- IN UINTN Offset,
- IN OUT UINTN *NumBytes,
- IN UINT8 *Buffer
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbProtocolEraseBlocks (
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
- ...
- )
-;
-
-EFI_STATUS
-EFIAPI
-FvbExtendProtocolEraseCustomBlockRange (
- IN EFI_FVB_EXTENSION_PROTOCOL *This,
- IN EFI_LBA StartLba,
- IN UINTN OffsetStartLba,
- IN EFI_LBA LastLba,
- IN UINTN OffsetLastLba
- )
-;
-
-#endif
diff --git a/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/ia32/Ia32Fwh.c b/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/ia32/Ia32Fwh.c
deleted file mode 100644
index 00998f8c67..0000000000
--- a/EdkNt32Pkg/RuntimeDxe/FvbServices/Common/ia32/Ia32Fwh.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*++
-
-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:
-
- Ia32Fwh.c
-
-Abstract:
-
-Revision History
-
---*/
-
-#include "FWBlockService.h"
-
-EFI_STATUS
-FvbSpecificInitialize (
- IN ESAL_FWB_GLOBAL *mFvbModuleGlobal
- )
-/*++
-
-Routine Description:
- Additional initialize code for IA32 platform.
-
-Arguments:
- ESAL_FWB_GLOBAL - Global pointer that points to the instance data
-
-Returns:
- EFI_SUCCESS
-
---*/
-{
- return EFI_SUCCESS;
-}
diff --git a/EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FWBlockService.c b/EdkNt32Pkg/RuntimeDxe/FvbServices/FWBlockService.c
index 1f2f8fd2b4..1f2f8fd2b4 100644
--- a/EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FWBlockService.c
+++ b/EdkNt32Pkg/RuntimeDxe/FvbServices/FWBlockService.c
diff --git a/EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FvbInfo.c b/EdkNt32Pkg/RuntimeDxe/FvbServices/FvbInfo.c
index d079423af8..d079423af8 100644
--- a/EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FvbInfo.c
+++ b/EdkNt32Pkg/RuntimeDxe/FvbServices/FvbInfo.c
diff --git a/EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FwBlockService.h b/EdkNt32Pkg/RuntimeDxe/FvbServices/FwBlockService.h
index 6f949d37ec..6f949d37ec 100644
--- a/EdkNt32Pkg/RuntimeDxe/FvbServices/nt32/FwBlockService.h
+++ b/EdkNt32Pkg/RuntimeDxe/FvbServices/FwBlockService.h
diff --git a/EdkNt32Pkg/RuntimeDxe/FvbServices/Nt32Fwh.msa b/EdkNt32Pkg/RuntimeDxe/FvbServices/Nt32Fwh.msa
index ab10daa036..ab55e56206 100644
--- a/EdkNt32Pkg/RuntimeDxe/FvbServices/Nt32Fwh.msa
+++ b/EdkNt32Pkg/RuntimeDxe/FvbServices/Nt32Fwh.msa
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!--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
@@ -65,12 +65,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
</LibraryClassDefinitions>
<SourceFiles>
<Filename>Nt32Fwh.dxs</Filename>
- <Filename SupArchList="IA32">nt32\FWBlockService.c</Filename>
- <Filename SupArchList="IA32">nt32\FwBlockService.h</Filename>
- <Filename SupArchList="IA32">nt32\FvbInfo.c</Filename>
- <Filename ToolCode="DUMMY">Common\FWBlockService.c</Filename>
- <Filename ToolCode="DUMMY">Common\FwBlockService.h</Filename>
- <Filename ToolCode="DUMMY">Common\ia32\Ia32Fwh.c</Filename>
+ <Filename SupArchList="IA32">FWBlockService.c</Filename>
+ <Filename SupArchList="IA32">FwBlockService.h</Filename>
+ <Filename SupArchList="IA32">FvbInfo.c</Filename>
</SourceFiles>
<PackageDependencies>
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
@@ -81,7 +78,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
<Protocol Usage="SOMETIMES_PRODUCED">
<ProtocolCName>gEfiDevicePathProtocolGuid</ProtocolCName>
</Protocol>
- <Protocol Usage="SOMETIMES_PRODUCED">
+ <Protocol Usage="ALWAYS_PRODUCED">
<ProtocolCName>gEfiFirmwareVolumeBlockProtocolGuid</ProtocolCName>
</Protocol>
<Protocol Usage="ALWAYS_PRODUCED">