/**@file Copyright (c) 2007, 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 // // The package level header files this module uses // #include // // The protocols, PPI and GUID defintions for this module // #include #include #include #include #include #include #include #include #include #include // // The Library classes this module consumes // #include #include #include #include #include #include #include #include #include #include #include #define FWH_READ_LOCK (1 << 2) #define FWH_LOCK_DOWN (1 << 1) #define FWH_WRITE_LOCK 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) // // BugBug: Add documentation here for data structure!!!! // #define FVB_PHYSICAL 0 #define FVB_VIRTUAL 1 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \ EFI_FVB2_READ_ENABLED_CAP | \ EFI_FVB2_WRITE_DISABLED_CAP | \ EFI_FVB2_WRITE_ENABLED_CAP | \ EFI_FVB2_LOCK_CAP \ ) #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS) typedef struct { EFI_LOCK FvbDevLock; UINTN FvBase[2]; // // We can treat VolumeSignature combined with MappedFile // as a unique key to locate the mapped file. #define MAX_PATH 256 UINT32 VolumeId; CHAR16 MappedFile[MAX_PATH]; UINT32 ActuralSize; UINT32 Offset; EFI_DEVICE_PATH_PROTOCOL *Device; // only used in BS period, won't use after memory map changed 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 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_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_2 *Attributes, IN ESAL_FWB_GLOBAL *Global, IN BOOLEAN Virtual ); EFI_STATUS FvbGetVolumeAttributes ( IN UINTN Instance, OUT EFI_FVB_ATTRIBUTES_2 *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 *LbaLength, OUT UINTN *NumOfBlocks, IN ESAL_FWB_GLOBAL *Global, IN BOOLEAN Virtual ); // // Protocol APIs // EFI_STATUS EFIAPI FvbProtocolGetAttributes ( IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, OUT EFI_FVB_ATTRIBUTES_2 *Attributes ); EFI_STATUS EFIAPI FvbProtocolSetAttributes ( IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes ); EFI_STATUS EFIAPI FvbProtocolGetPhysicalAddress ( IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, OUT EFI_PHYSICAL_ADDRESS *Address ); EFI_STATUS EFIAPI FvbProtocolGetBlockSize ( IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, IN EFI_LBA Lba, OUT UINTN *BlockSize, OUT UINTN *NumOfBlocks ); EFI_STATUS EFIAPI FvbProtocolRead ( IN CONST 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 CONST 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 CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, ... ); #endif