| /** @file | |
| The header file for Firmware volume block driver. | |
| Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef FW_BLOCK_SERVICE_H_ | |
| #define FW_BLOCK_SERVICE_H_ | |
| #include <Guid/EventGroup.h> | |
| #include <Guid/FirmwareFileSystem2.h> | |
| #include <Guid/SystemNvDataGuid.h> | |
| #include <Guid/VariableFormat.h> | |
| #include <Protocol/DevicePath.h> | |
| #include <Protocol/FirmwareVolumeBlock.h> | |
| #include <Library/UefiDriverEntryPoint.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Library/UefiLib.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/IoLib.h> | |
| #include <Library/CacheMaintenanceLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/PcdLib.h> | |
| #include <Library/FlashDeviceLib.h> | |
| #include <Library/DevicePathLib.h> | |
| #include <Library/HobLib.h> | |
| #include <Library/DxeServicesLib.h> | |
| #include <Guid/NvVariableInfoGuid.h> | |
| #include <Register/ArchitecturalMsr.h> | |
| // | |
| // Define two helper macro to extract the Capability field or Status field in FVB | |
| // bit fields | |
| // | |
| #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 { | |
| UINTN FvBase; | |
| UINTN NumOfBlocks; | |
| // | |
| // Note!!!: VolumeHeader must be the last element | |
| // of the structure. | |
| // | |
| EFI_FIRMWARE_VOLUME_HEADER VolumeHeader; | |
| } EFI_FW_VOL_INSTANCE; | |
| typedef struct { | |
| EFI_FW_VOL_INSTANCE *FvInstance; | |
| UINT32 NumFv; | |
| UINT32 Flags; | |
| } 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 { | |
| MEDIA_FW_VOL_DEVICE_PATH FvDevPath; | |
| EFI_DEVICE_PATH_PROTOCOL EndDevPath; | |
| } FV_PIWG_DEVICE_PATH; | |
| typedef struct { | |
| MEMMAP_DEVICE_PATH MemMapDevPath; | |
| EFI_DEVICE_PATH_PROTOCOL EndDevPath; | |
| } FV_MEMMAP_DEVICE_PATH; | |
| typedef struct { | |
| UINT32 Signature; | |
| EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
| UINTN Instance; | |
| EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance; | |
| } EFI_FW_VOL_BLOCK_DEVICE; | |
| /** | |
| Get a heathy FV header used for variable store recovery | |
| @retval The FV header. | |
| **/ | |
| EFI_FIRMWARE_VOLUME_HEADER * | |
| GetFvHeaderTemplate ( | |
| VOID | |
| ); | |
| EFI_STATUS | |
| InitVariableStore ( | |
| VOID | |
| ); | |
| // | |
| // 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, | |
| OUT 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, | |
| ... | |
| ); | |
| EFI_FW_VOL_INSTANCE * | |
| GetFvbInstance ( | |
| IN UINTN Instance | |
| ); | |
| EFI_STATUS | |
| InstallFvbProtocol ( | |
| IN EFI_FW_VOL_INSTANCE *FwhInstance, | |
| IN UINTN InstanceNum | |
| ); | |
| EFI_STATUS | |
| FvbInitialize ( | |
| VOID | |
| ); | |
| extern FWB_GLOBAL mFvbModuleGlobal; | |
| extern EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate; | |
| extern FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate; | |
| extern FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate; | |
| #endif |