123c98c9417908188207408afa3f6901b8aca826aqhuang/** @file 2022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang Firmware Volume Block protocol functions. 323c98c9417908188207408afa3f6901b8aca826aqhuang Consumes FV hobs and creates appropriate block protocols. 423c98c9417908188207408afa3f6901b8aca826aqhuang 50c3a1db40f982d243b8e2c67ee4e8109a0737d34lzengCopyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> 6cd5ebaa06dca3e6ef3c464081e6defe00d358c69hhtianThis program and the accompanying materials 723c98c9417908188207408afa3f6901b8aca826aqhuangare licensed and made available under the terms and conditions of the BSD License 823c98c9417908188207408afa3f6901b8aca826aqhuangwhich accompanies this distribution. The full text of the license may be found at 923c98c9417908188207408afa3f6901b8aca826aqhuanghttp://opensource.org/licenses/bsd-license.php 1023c98c9417908188207408afa3f6901b8aca826aqhuang 1123c98c9417908188207408afa3f6901b8aca826aqhuangTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1223c98c9417908188207408afa3f6901b8aca826aqhuangWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1328a00297189c323096aae8e2975de94e8549613cyshang 14504214c4870e9183418014634268ce630eb5332algao**/ 1528a00297189c323096aae8e2975de94e8549613cyshang 1628a00297189c323096aae8e2975de94e8549613cyshang#ifndef _FWVOL_BLOCK_H_ 1728a00297189c323096aae8e2975de94e8549613cyshang#define _FWVOL_BLOCK_H_ 1828a00297189c323096aae8e2975de94e8549613cyshang 1928a00297189c323096aae8e2975de94e8549613cyshang 20f3f2e05db8c89628498ec4efdb16184747824c63qhuang#define FVB_DEVICE_SIGNATURE SIGNATURE_32('_','F','V','B') 2128a00297189c323096aae8e2975de94e8549613cyshang 22ec90508b3d3ff22a698a0446cb09d551d7466045eric_tian 2328a00297189c323096aae8e2975de94e8549613cyshangtypedef struct { 2428a00297189c323096aae8e2975de94e8549613cyshang UINTN Base; 2528a00297189c323096aae8e2975de94e8549613cyshang UINTN Length; 2628a00297189c323096aae8e2975de94e8549613cyshang} LBA_CACHE; 2728a00297189c323096aae8e2975de94e8549613cyshang 2828a00297189c323096aae8e2975de94e8549613cyshangtypedef struct { 2928a00297189c323096aae8e2975de94e8549613cyshang MEMMAP_DEVICE_PATH MemMapDevPath; 3028a00297189c323096aae8e2975de94e8549613cyshang EFI_DEVICE_PATH_PROTOCOL EndDevPath; 3184266565f5957184483515157987168e2c930a60klu} FV_MEMMAP_DEVICE_PATH; 3228a00297189c323096aae8e2975de94e8549613cyshang 3384266565f5957184483515157987168e2c930a60klu// 3484266565f5957184483515157987168e2c930a60klu// UEFI Specification define FV device path format if FV provide name guid in extension header 3584266565f5957184483515157987168e2c930a60klu// 3684266565f5957184483515157987168e2c930a60klutypedef struct { 3784266565f5957184483515157987168e2c930a60klu MEDIA_FW_VOL_DEVICE_PATH FvDevPath; 3884266565f5957184483515157987168e2c930a60klu EFI_DEVICE_PATH_PROTOCOL EndDevPath; 3984266565f5957184483515157987168e2c930a60klu} FV_PIWG_DEVICE_PATH; 4028a00297189c323096aae8e2975de94e8549613cyshang 4128a00297189c323096aae8e2975de94e8549613cyshangtypedef struct { 4228a00297189c323096aae8e2975de94e8549613cyshang UINTN Signature; 4328a00297189c323096aae8e2975de94e8549613cyshang EFI_HANDLE Handle; 4484266565f5957184483515157987168e2c930a60klu EFI_DEVICE_PATH_PROTOCOL *DevicePath; 4528a00297189c323096aae8e2975de94e8549613cyshang EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance; 4628a00297189c323096aae8e2975de94e8549613cyshang UINTN NumBlocks; 4728a00297189c323096aae8e2975de94e8549613cyshang LBA_CACHE *LbaCache; 4828a00297189c323096aae8e2975de94e8549613cyshang UINT32 FvbAttributes; 4928a00297189c323096aae8e2975de94e8549613cyshang EFI_PHYSICAL_ADDRESS BaseAddress; 500c3a1db40f982d243b8e2c67ee4e8109a0737d34lzeng UINT32 AuthenticationStatus; 5128a00297189c323096aae8e2975de94e8549613cyshang} EFI_FW_VOL_BLOCK_DEVICE; 5228a00297189c323096aae8e2975de94e8549613cyshang 53ec90508b3d3ff22a698a0446cb09d551d7466045eric_tian 5428a00297189c323096aae8e2975de94e8549613cyshang#define FVB_DEVICE_FROM_THIS(a) \ 5528a00297189c323096aae8e2975de94e8549613cyshang CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE) 5628a00297189c323096aae8e2975de94e8549613cyshang 5728a00297189c323096aae8e2975de94e8549613cyshang 58162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang/** 59162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang Retrieves Volume attributes. No polarity translations are done. 60162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 61022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param This Calling context 62022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Attributes output buffer which contains attributes 63162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 64162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang @retval EFI_SUCCESS The firmware volume attributes were returned. 65162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 66162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang**/ 6728a00297189c323096aae8e2975de94e8549613cyshangEFI_STATUS 6828a00297189c323096aae8e2975de94e8549613cyshangEFIAPI 6928a00297189c323096aae8e2975de94e8549613cyshangFwVolBlockGetAttributes ( 7028a00297189c323096aae8e2975de94e8549613cyshang IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 718ee3a1990874ae94da24e8c2a97e941fdfcf74a6vanjeff OUT EFI_FVB_ATTRIBUTES_2 *Attributes 7223c98c9417908188207408afa3f6901b8aca826aqhuang ); 7328a00297189c323096aae8e2975de94e8549613cyshang 7428a00297189c323096aae8e2975de94e8549613cyshang 7528a00297189c323096aae8e2975de94e8549613cyshang 76162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang/** 77162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang Modifies the current settings of the firmware volume according to the input parameter. 7828a00297189c323096aae8e2975de94e8549613cyshang 79022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param This Calling context 80022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Attributes input buffer which contains attributes 8128a00297189c323096aae8e2975de94e8549613cyshang 82022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_SUCCESS The firmware volume attributes were returned. 83022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_INVALID_PARAMETER The attributes requested are in conflict with 84022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang the capabilities as declared in the firmware 85022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang volume header. 86162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang @retval EFI_UNSUPPORTED Not supported. 8728a00297189c323096aae8e2975de94e8549613cyshang 88162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang**/ 8928a00297189c323096aae8e2975de94e8549613cyshangEFI_STATUS 9028a00297189c323096aae8e2975de94e8549613cyshangEFIAPI 9128a00297189c323096aae8e2975de94e8549613cyshangFwVolBlockSetAttributes ( 9228a00297189c323096aae8e2975de94e8549613cyshang IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 938ee3a1990874ae94da24e8c2a97e941fdfcf74a6vanjeff IN CONST EFI_FVB_ATTRIBUTES_2 *Attributes 9423c98c9417908188207408afa3f6901b8aca826aqhuang ); 9528a00297189c323096aae8e2975de94e8549613cyshang 9628a00297189c323096aae8e2975de94e8549613cyshang 9728a00297189c323096aae8e2975de94e8549613cyshang 98162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang/** 99162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang The EraseBlock() function erases one or more blocks as denoted by the 100162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang variable argument list. The entire parameter list of blocks must be verified 101162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang prior to erasing any blocks. If a block is requested that does not exist 102162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang within the associated firmware volume (it has a larger index than the last 103162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang block of the firmware volume), the EraseBlock() function must return 104162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang EFI_INVALID_PARAMETER without modifying the contents of the firmware volume. 105162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 106022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param This Calling context 107022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param ... Starting LBA followed by Number of Lba to erase. 108022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang a -1 to terminate the list. 109022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang 110022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_SUCCESS The erase request was successfully completed. 111022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled 112022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang state. 113022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_DEVICE_ERROR The block device is not functioning correctly 114022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang and could not be written. The firmware device 115022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang may have been partially erased. 116022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_INVALID_PARAMETER One or more of the LBAs listed in the variable 117022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang argument list do 118162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang @retval EFI_UNSUPPORTED Not supported. 11928a00297189c323096aae8e2975de94e8549613cyshang 120162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang**/ 12128a00297189c323096aae8e2975de94e8549613cyshangEFI_STATUS 12228a00297189c323096aae8e2975de94e8549613cyshangEFIAPI 12328a00297189c323096aae8e2975de94e8549613cyshangFwVolBlockEraseBlock ( 12428a00297189c323096aae8e2975de94e8549613cyshang IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 12528a00297189c323096aae8e2975de94e8549613cyshang ... 12623c98c9417908188207408afa3f6901b8aca826aqhuang ); 12728a00297189c323096aae8e2975de94e8549613cyshang 12828a00297189c323096aae8e2975de94e8549613cyshang 129162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 130162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang/** 131162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang Read the specified number of bytes from the block to the input buffer. 132162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 133022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param This Indicates the calling context. 134022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Lba The starting logical block index to read. 135022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Offset Offset into the block at which to begin reading. 136022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param NumBytes Pointer to a UINT32. At entry, *NumBytes 137022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang contains the total size of the buffer. At exit, 138022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang *NumBytes contains the total number of bytes 139022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang actually read. 140022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Buffer Pinter to a caller-allocated buffer that 141022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang contains the destine for the read. 142022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang 143022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_SUCCESS The firmware volume was read successfully. 144022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_BAD_BUFFER_SIZE The read was attempted across an LBA boundary. 145022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_ACCESS_DENIED Access denied. 146022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_DEVICE_ERROR The block device is malfunctioning and could not 147162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang be read. 148162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 149162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang**/ 15028a00297189c323096aae8e2975de94e8549613cyshangEFI_STATUS 15128a00297189c323096aae8e2975de94e8549613cyshangEFIAPI 15228a00297189c323096aae8e2975de94e8549613cyshangFwVolBlockReadBlock ( 15328a00297189c323096aae8e2975de94e8549613cyshang IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 15428a00297189c323096aae8e2975de94e8549613cyshang IN CONST EFI_LBA Lba, 15528a00297189c323096aae8e2975de94e8549613cyshang IN CONST UINTN Offset, 15628a00297189c323096aae8e2975de94e8549613cyshang IN OUT UINTN *NumBytes, 15728a00297189c323096aae8e2975de94e8549613cyshang IN OUT UINT8 *Buffer 15823c98c9417908188207408afa3f6901b8aca826aqhuang ); 15928a00297189c323096aae8e2975de94e8549613cyshang 160022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang 161162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 162162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang/** 163162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang Writes the specified number of bytes from the input buffer to the block. 164162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 165022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param This Indicates the calling context. 166022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Lba The starting logical block index to write to. 167022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Offset Offset into the block at which to begin writing. 168022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param NumBytes Pointer to a UINT32. At entry, *NumBytes 169022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang contains the total size of the buffer. At exit, 170022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang *NumBytes contains the total number of bytes 171022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang actually written. 172022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Buffer Pinter to a caller-allocated buffer that 173022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang contains the source for the write. 174022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang 175022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_SUCCESS The firmware volume was written successfully. 176022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_BAD_BUFFER_SIZE The write was attempted across an LBA boundary. 177022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang On output, NumBytes contains the total number of 178022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang bytes actually written. 179022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled 180022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang state. 181022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_DEVICE_ERROR The block device is malfunctioning and could not 182022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang be written. 183162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang @retval EFI_UNSUPPORTED Not supported. 184162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 185162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang**/ 18628a00297189c323096aae8e2975de94e8549613cyshangEFI_STATUS 18728a00297189c323096aae8e2975de94e8549613cyshangEFIAPI 18828a00297189c323096aae8e2975de94e8549613cyshangFwVolBlockWriteBlock ( 18923c98c9417908188207408afa3f6901b8aca826aqhuang IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 19023c98c9417908188207408afa3f6901b8aca826aqhuang IN EFI_LBA Lba, 19123c98c9417908188207408afa3f6901b8aca826aqhuang IN UINTN Offset, 19223c98c9417908188207408afa3f6901b8aca826aqhuang IN OUT UINTN *NumBytes, 19323c98c9417908188207408afa3f6901b8aca826aqhuang IN UINT8 *Buffer 19423c98c9417908188207408afa3f6901b8aca826aqhuang ); 19528a00297189c323096aae8e2975de94e8549613cyshang 196022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang 197162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 198162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang/** 199162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang Get Fvb's base address. 200162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 201022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param This Indicates the calling context. 202022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Address Fvb device base address. 203162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 204022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_SUCCESS Successfully got Fvb's base address. 205162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang @retval EFI_UNSUPPORTED Not supported. 206162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 207162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang**/ 20828a00297189c323096aae8e2975de94e8549613cyshangEFI_STATUS 20928a00297189c323096aae8e2975de94e8549613cyshangEFIAPI 21028a00297189c323096aae8e2975de94e8549613cyshangFwVolBlockGetPhysicalAddress ( 21123c98c9417908188207408afa3f6901b8aca826aqhuang IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 21223c98c9417908188207408afa3f6901b8aca826aqhuang OUT EFI_PHYSICAL_ADDRESS *Address 21323c98c9417908188207408afa3f6901b8aca826aqhuang ); 21428a00297189c323096aae8e2975de94e8549613cyshang 21528a00297189c323096aae8e2975de94e8549613cyshang 21628a00297189c323096aae8e2975de94e8549613cyshang 217162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang/** 218162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang Retrieves the size in bytes of a specific block within a firmware volume. 219162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang 220022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param This Indicates the calling context. 221022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param Lba Indicates the block for which to return the 222022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang size. 223022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param BlockSize Pointer to a caller-allocated UINTN in which the 224022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang size of the block is returned. 225022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @param NumberOfBlocks Pointer to a caller-allocated UINTN in which the 226022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang number of consecutive blocks starting with Lba 227022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang is returned. All blocks in this range have a 228022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang size of BlockSize. 229022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang 230022c6d45ef78605c173023f53984e4dfaf7b11f4qhuang @retval EFI_SUCCESS The firmware volume base address is returned. 231162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang @retval EFI_INVALID_PARAMETER The requested LBA is out of range. 23228a00297189c323096aae8e2975de94e8549613cyshang 233162ed594438ab8d39f89b43e6d645ca24e1e1e65qhuang**/ 23428a00297189c323096aae8e2975de94e8549613cyshangEFI_STATUS 23528a00297189c323096aae8e2975de94e8549613cyshangEFIAPI 23628a00297189c323096aae8e2975de94e8549613cyshangFwVolBlockGetBlockSize ( 23728a00297189c323096aae8e2975de94e8549613cyshang IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 23828a00297189c323096aae8e2975de94e8549613cyshang IN CONST EFI_LBA Lba, 23923c98c9417908188207408afa3f6901b8aca826aqhuang IN OUT UINTN *BlockSize, 24023c98c9417908188207408afa3f6901b8aca826aqhuang IN OUT UINTN *NumberOfBlocks 24123c98c9417908188207408afa3f6901b8aca826aqhuang ); 24228a00297189c323096aae8e2975de94e8549613cyshang 24328a00297189c323096aae8e2975de94e8549613cyshang 24428a00297189c323096aae8e2975de94e8549613cyshang#endif 245