| /** @file | |
| Firmware Volume Block protocol functions. | |
| Consumes FV hobs and creates appropriate block protocols. | |
| Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef _FWVOL_BLOCK_H_ | |
| #define _FWVOL_BLOCK_H_ | |
| #define FVB_DEVICE_SIGNATURE SIGNATURE_32('_','F','V','B') | |
| typedef struct { | |
| UINTN Base; | |
| UINTN Length; | |
| } LBA_CACHE; | |
| typedef struct { | |
| MEMMAP_DEVICE_PATH MemMapDevPath; | |
| EFI_DEVICE_PATH_PROTOCOL EndDevPath; | |
| } FV_MEMMAP_DEVICE_PATH; | |
| // | |
| // UEFI Specification define FV device path format if FV provide name guid in extension header | |
| // | |
| typedef struct { | |
| MEDIA_FW_VOL_DEVICE_PATH FvDevPath; | |
| EFI_DEVICE_PATH_PROTOCOL EndDevPath; | |
| } FV_PIWG_DEVICE_PATH; | |
| typedef struct { | |
| UINTN Signature; | |
| EFI_HANDLE Handle; | |
| EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
| EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance; | |
| UINTN NumBlocks; | |
| LBA_CACHE *LbaCache; | |
| UINT32 FvbAttributes; | |
| EFI_PHYSICAL_ADDRESS BaseAddress; | |
| UINT32 AuthenticationStatus; | |
| } EFI_FW_VOL_BLOCK_DEVICE; | |
| #define FVB_DEVICE_FROM_THIS(a) \ | |
| CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE) | |
| /** | |
| Retrieves Volume attributes. No polarity translations are done. | |
| @param This Calling context | |
| @param Attributes output buffer which contains attributes | |
| @retval EFI_SUCCESS The firmware volume attributes were returned. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FwVolBlockGetAttributes ( | |
| IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, | |
| OUT EFI_FVB_ATTRIBUTES_2 *Attributes | |
| ); | |
| /** | |
| Modifies the current settings of the firmware volume according to the input parameter. | |
| @param This Calling context | |
| @param Attributes input buffer which contains attributes | |
| @retval EFI_SUCCESS The firmware volume attributes were returned. | |
| @retval EFI_INVALID_PARAMETER The attributes requested are in conflict with | |
| the capabilities as declared in the firmware | |
| volume header. | |
| @retval EFI_UNSUPPORTED Not supported. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FwVolBlockSetAttributes ( | |
| IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, | |
| IN CONST EFI_FVB_ATTRIBUTES_2 *Attributes | |
| ); | |
| /** | |
| 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. | |
| @param This Calling context | |
| @param ... Starting LBA followed by Number of Lba to erase. | |
| a -1 to terminate the list. | |
| @retval EFI_SUCCESS The erase request was successfully completed. | |
| @retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled | |
| state. | |
| @retval EFI_DEVICE_ERROR The block device is not functioning correctly | |
| and could not be written. The firmware device | |
| may have been partially erased. | |
| @retval EFI_INVALID_PARAMETER One or more of the LBAs listed in the variable | |
| argument list do | |
| @retval EFI_UNSUPPORTED Not supported. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FwVolBlockEraseBlock ( | |
| IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, | |
| ... | |
| ); | |
| /** | |
| Read the specified number of bytes from the block to the input buffer. | |
| @param This Indicates the calling context. | |
| @param Lba The starting logical block index to read. | |
| @param Offset Offset into the block at which to begin reading. | |
| @param NumBytes Pointer to a UINT32. At entry, *NumBytes | |
| contains the total size of the buffer. At exit, | |
| *NumBytes contains the total number of bytes | |
| actually read. | |
| @param Buffer Pinter to a caller-allocated buffer that | |
| contains the destine for the read. | |
| @retval EFI_SUCCESS The firmware volume was read successfully. | |
| @retval EFI_BAD_BUFFER_SIZE The read was attempted across an LBA boundary. | |
| @retval EFI_ACCESS_DENIED Access denied. | |
| @retval EFI_DEVICE_ERROR The block device is malfunctioning and could not | |
| be read. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FwVolBlockReadBlock ( | |
| IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, | |
| IN CONST EFI_LBA Lba, | |
| IN CONST UINTN Offset, | |
| IN OUT UINTN *NumBytes, | |
| IN OUT UINT8 *Buffer | |
| ); | |
| /** | |
| Writes the specified number of bytes from the input buffer to the block. | |
| @param This Indicates the calling context. | |
| @param Lba The starting logical block index to write to. | |
| @param Offset Offset into the block at which to begin writing. | |
| @param NumBytes Pointer to a UINT32. At entry, *NumBytes | |
| contains the total size of the buffer. At exit, | |
| *NumBytes contains the total number of bytes | |
| actually written. | |
| @param Buffer Pinter to a caller-allocated buffer that | |
| contains the source for the write. | |
| @retval EFI_SUCCESS The firmware volume was written successfully. | |
| @retval EFI_BAD_BUFFER_SIZE The write was attempted across an LBA boundary. | |
| On output, NumBytes contains the total number of | |
| bytes actually written. | |
| @retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled | |
| state. | |
| @retval EFI_DEVICE_ERROR The block device is malfunctioning and could not | |
| be written. | |
| @retval EFI_UNSUPPORTED Not supported. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FwVolBlockWriteBlock ( | |
| IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, | |
| IN EFI_LBA Lba, | |
| IN UINTN Offset, | |
| IN OUT UINTN *NumBytes, | |
| IN UINT8 *Buffer | |
| ); | |
| /** | |
| Get Fvb's base address. | |
| @param This Indicates the calling context. | |
| @param Address Fvb device base address. | |
| @retval EFI_SUCCESS Successfully got Fvb's base address. | |
| @retval EFI_UNSUPPORTED Not supported. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FwVolBlockGetPhysicalAddress ( | |
| IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, | |
| OUT EFI_PHYSICAL_ADDRESS *Address | |
| ); | |
| /** | |
| Retrieves the size in bytes of a specific block within a firmware volume. | |
| @param This Indicates the calling context. | |
| @param Lba Indicates the block for which to return the | |
| size. | |
| @param BlockSize Pointer to a caller-allocated UINTN in which the | |
| size of the block is returned. | |
| @param NumberOfBlocks 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. | |
| @retval EFI_SUCCESS The firmware volume base address is returned. | |
| @retval EFI_INVALID_PARAMETER The requested LBA is out of range. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FwVolBlockGetBlockSize ( | |
| IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, | |
| IN CONST EFI_LBA Lba, | |
| IN OUT UINTN *BlockSize, | |
| IN OUT UINTN *NumberOfBlocks | |
| ); | |
| #endif |