Home | History | Annotate | Download | only in Protocol
      1 /** @file
      2   This file provides control over block-oriented firmware devices.
      3 
      4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials are licensed and made available under
      6 the terms and conditions of the BSD License that accompanies this distribution.
      7 The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php.
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13   @par Revision Reference:
     14   This protocol is defined in framework spec: Firmware Volume Block Specification.
     15 
     16 **/
     17 
     18 #ifndef __FRAMEWORK_FIRMWARE_VOLUME_BLOCK_H__
     19 #define __FRAMEWORK_FIRMWARE_VOLUME_BLOCK_H__
     20 
     21 #define FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID \
     22 { 0xDE28BC59, 0x6228, 0x41BD, {0xBD, 0xF6, 0xA3, 0xB9, 0xAD,0xB5, 0x8D, 0xA1 } }
     23 
     24 typedef struct _FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL;
     25 ///
     26 /// The type of EFI FVB attribute per the Framework specification.
     27 ///
     28 typedef UINT32  EFI_FVB_ATTRIBUTES;
     29 
     30 /**
     31   The GetAttributes() function retrieves the attributes and
     32   current settings of the block.
     33 
     34   @param This       Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.
     35 
     36   @param Attributes Pointer to EFI_FVB_ATTRIBUTES in which the
     37                     attributes and current settings are
     38                     returned.
     39 
     40   @retval EFI_SUCCESS The firmware volume attributes were
     41                       returned.
     42 
     43 **/
     44 typedef
     45 EFI_STATUS
     46 (EFIAPI * FRAMEWORK_EFI_FVB_GET_ATTRIBUTES)(
     47   IN   FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
     48   OUT  EFI_FVB_ATTRIBUTES                *Attributes
     49 );
     50 
     51 
     52 /**
     53   The SetAttributes() function sets configurable firmware volume
     54   attributes and returns the new settings of the firmware volume.
     55 
     56   @param This         Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.
     57 
     58   @param Attributes   On input, Attributes is a pointer to
     59                       EFI_FVB_ATTRIBUTES that contains the
     60                       desired firmware volume settings. On
     61                       successful return, it contains the new
     62                       settings of the firmware volume.
     63 
     64   @retval EFI_SUCCESS           The firmware volume attributes were returned.
     65 
     66   @retval EFI_INVALID_PARAMETER The attributes requested are in
     67                                 conflict with the capabilities
     68                                 as declared in the firmware
     69                                 volume header.
     70 
     71 **/
     72 typedef
     73 EFI_STATUS
     74 (EFIAPI * FRAMEWORK_EFI_FVB_SET_ATTRIBUTES)(
     75   IN      FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
     76   IN OUT  EFI_FVB_ATTRIBUTES                *Attributes
     77 );
     78 
     79 
     80 /**
     81   The GetPhysicalAddress() function retrieves the base address of
     82   a memory-mapped firmware volume. This function should be called
     83   only for memory-mapped firmware volumes.
     84 
     85   @param This     Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.
     86 
     87   @param Address  Pointer to a caller-allocated
     88                   EFI_PHYSICAL_ADDRESS that, on successful
     89                   return from GetPhysicalAddress(), contains the
     90                   base address of the firmware volume.
     91 
     92   @retval EFI_SUCCESS       The firmware volume base address is returned.
     93 
     94   @retval EFI_NOT_SUPPORTED The firmware volume is not memory mapped.
     95 
     96 **/
     97 typedef
     98 EFI_STATUS
     99 (EFIAPI * FRAMEWORK_EFI_FVB_GET_PHYSICAL_ADDRESS)(
    100   IN    FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
    101   OUT   EFI_PHYSICAL_ADDRESS                *Address
    102 );
    103 
    104 /**
    105   The GetBlockSize() function retrieves the size of the requested
    106   block. It also returns the number of additional blocks with
    107   the identical size. The GetBlockSize() function is used to
    108   retrieve the block map (see EFI_FIRMWARE_VOLUME_HEADER).
    109 
    110 
    111   @param This           Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.
    112 
    113   @param Lba            Indicates the block for which to return the size.
    114 
    115   @param BlockSize      The pointer to a caller-allocated UINTN in which
    116                         the size of the block is returned.
    117 
    118   @param NumberOfBlocks The pointer to a caller-allocated UINTN in
    119                         which the number of consecutive blocks,
    120                         starting with Lba, is returned. All
    121                         blocks in this range have a size of
    122                         BlockSize.
    123 
    124 
    125   @retval EFI_SUCCESS             The firmware volume base address was returned.
    126 
    127   @retval EFI_INVALID_PARAMETER   The requested LBA is out of range.
    128 
    129 **/
    130 typedef
    131 EFI_STATUS
    132 (EFIAPI * FRAMEWORK_EFI_FVB_GET_BLOCK_SIZE)(
    133   IN  FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
    134   IN  EFI_LBA                             Lba,
    135   OUT UINTN                               *BlockSize,
    136   OUT UINTN                               *NumberOfBlocks
    137 );
    138 
    139 
    140 /**
    141   Reads the specified number of bytes into a buffer from the specified block.
    142 
    143   The Read() function reads the requested number of bytes from the
    144   requested block and stores them in the provided buffer.
    145   Implementations should be mindful that the firmware volume
    146   might be in the ReadDisabled state. If it is in this state,
    147   the Read() function must return the status code
    148   EFI_ACCESS_DENIED without modifying the contents of the
    149   buffer. The Read() function must also prevent spanning block
    150   boundaries. If a read is requested that would span a block
    151   boundary, the read must read up to the boundary but not
    152   beyond. The output parameter NumBytes must be set to correctly
    153   indicate the number of bytes actually read. The caller must be
    154   aware that a read may be partially completed.
    155 
    156   @param This     Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.
    157 
    158   @param Lba      The starting logical block index
    159                   from which to read.
    160 
    161   @param Offset   Offset into the block at which to begin reading.
    162 
    163   @param NumBytes The pointer to a UINTN. At entry, *NumBytes
    164                   contains the total size of the buffer. At
    165                   exit, *NumBytes contains the total number of
    166                   bytes read.
    167 
    168   @param Buffer   The pointer to a caller-allocated buffer that will
    169                   be used to hold the data that is read.
    170 
    171   @retval EFI_SUCCESS         The firmware volume was read successfully
    172                               and contents are in Buffer.
    173 
    174   @retval EFI_BAD_BUFFER_SIZE A read was attempted across an LBA
    175                               boundary. On output, NumBytes
    176                               contains the total number of bytes
    177                               returned in Buffer.
    178 
    179   @retval EFI_ACCESS_DENIED   The firmware volume is in the
    180                               ReadDisabled state.
    181 
    182   @retval EFI_DEVICE_ERROR    The block device is not
    183                               functioning correctly and could
    184                               not be read.
    185 
    186 **/
    187 typedef
    188 EFI_STATUS
    189 (EFIAPI *FRAMEWORK_EFI_FVB_READ)(
    190   IN       FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
    191   IN       EFI_LBA                             Lba,
    192   IN       UINTN                               Offset,
    193   IN OUT   UINTN                               *NumBytes,
    194   IN OUT   UINT8                               *Buffer
    195 );
    196 
    197 /**
    198   Writes the specified number of bytes from the input buffer to the block.
    199 
    200   The Write() function writes the specified number of bytes from
    201   the provided buffer to the specified block and offset. If the
    202   firmware volume is sticky write, the caller must ensure that
    203   all the bits of the specified range to write are in the
    204   EFI_FVB_ERASE_POLARITY state before calling the Write()
    205   function, or else the result will be unpredictable. This
    206   unpredictability arises because, for a sticky-write firmware
    207   volume, a write may negate a bit in the EFI_FVB_ERASE_POLARITY
    208   state but cannot flip it back again. In general, before
    209   calling the Write() function, the caller should call the
    210   EraseBlocks() function first to erase the specified block to
    211   write. A block erase cycle will transition bits from the
    212   (NOT)EFI_FVB_ERASE_POLARITY state back to the
    213   EFI_FVB_ERASE_POLARITY state. Implementors should note
    214   that the firmware volume might be in the WriteDisabled
    215   state. If it is in this state, the Write() function must
    216   return the status code EFI_ACCESS_DENIED without modifying the
    217   contents of the firmware volume. The Write() function must
    218   also prevent spanning block boundaries. If a write is
    219   requested that spans a block boundary, the write must store up
    220   to the boundary but not beyond. The output parameter NumBytes
    221   must be set to correctly indicate the number of bytes actually
    222   written. The caller must be aware that a write may be
    223   partially completed. All writes, partial or otherwise, must be
    224   fully flushed to the hardware before the Write() service
    225   returns.
    226 
    227   @param This     Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.
    228 
    229   @param Lba      The starting logical block index to write to.
    230 
    231   @param Offset   Offset into the block at which to begin writing.
    232 
    233   @param NumBytes The pointer to a UINTN. Input: the total size of the buffer.
    234                   Output: the total number of bytes actually written.
    235 
    236   @param Buffer   The pointer to a caller-allocated buffer that
    237                   contains the source for the write.
    238 
    239   @retval EFI_SUCCESS         The firmware volume was written successfully.
    240 
    241   @retval EFI_BAD_BUFFER_SIZE The write was attempted across an
    242                               LBA boundary. On output, NumBytes
    243                               contains the total number of bytes
    244                               actually written.
    245 
    246   @retval EFI_ACCESS_DENIED   The firmware volume is in the
    247                               WriteDisabled state.
    248 
    249   @retval EFI_DEVICE_ERROR    The block device is malfunctioning
    250                               and could not be written.
    251 
    252 
    253 **/
    254 typedef
    255 EFI_STATUS
    256 (EFIAPI * FRAMEWORK_EFI_FVB_WRITE)(
    257   IN       FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
    258   IN       EFI_LBA                             Lba,
    259   IN       UINTN                               Offset,
    260   IN OUT   UINTN                               *NumBytes,
    261   IN       UINT8                               *Buffer
    262 );
    263 
    264 
    265 
    266 
    267 ///
    268 /// EFI_LBA_LIST_TERMINATOR.
    269 ///
    270 #define FRAMEWORK_EFI_LBA_LIST_TERMINATOR   0xFFFFFFFFFFFFFFFFULL
    271 
    272 
    273 /**
    274   Erases and initializes a firmware volume block.
    275 
    276   The EraseBlocks() function erases one or more blocks as denoted
    277   by the variable argument list. The entire parameter list of
    278   blocks must be verified before erasing any blocks. If a block is
    279   requested that does not exist within the associated firmware
    280   volume (it has a larger index than the last block of the
    281   firmware volume), the EraseBlocks() function must return the
    282   status code EFI_INVALID_PARAMETER without modifying the contents
    283   of the firmware volume. Implementors should note that
    284   the firmware volume might be in the WriteDisabled state. If it
    285   is in this state, the EraseBlocks() function must return the
    286   status code EFI_ACCESS_DENIED without modifying the contents of
    287   the firmware volume. All calls to EraseBlocks() must be fully
    288   flushed to the hardware before the EraseBlocks() service
    289   returns.
    290 
    291   @param This   Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
    292                 instance.
    293 
    294   @param ...    A list of tuples.
    295                 Each tuple describes a range of LBAs to erase
    296                 and consists of the following:
    297                 - An EFI_LBA that indicates the starting LBA
    298                 - A UINTN that indicates the number of blocks to
    299                   erase
    300 
    301                 The list is terminated with an
    302                 EFI_LBA_LIST_TERMINATOR. For example, the
    303                 following indicates that two ranges of blocks
    304                 (5-7 and 10-11) are to be erased: EraseBlocks
    305                 (This, 5, 3, 10, 2, EFI_LBA_LIST_TERMINATOR);
    306 
    307   @retval EFI_SUCCESS The erase request successfully
    308                       completed.
    309 
    310   @retval EFI_ACCESS_DENIED   The firmware volume is in the
    311                               WriteDisabled state.
    312   @retval EFI_DEVICE_ERROR  The block device is not functioning
    313                             correctly and could not be written.
    314                             The firmware device may have been
    315                             partially erased.
    316   @retval EFI_INVALID_PARAMETER One or more of the LBAs listed
    317                                 in the variable argument list do
    318                                 not exist in the firmware volume.
    319 
    320 **/
    321 typedef
    322 EFI_STATUS
    323 (EFIAPI * FRAMEWORK_EFI_FVB_ERASE_BLOCKS)(
    324   IN   FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
    325   ...
    326 );
    327 
    328 ///
    329 /// The Firmware Volume Block Protocol is the low-level interface
    330 /// to a firmware volume. File-level access to a firmware volume
    331 /// should not be done using the Firmware Volume Block Protocol.
    332 /// Normal access to a firmware volume must use the Firmware
    333 /// Volume Protocol. Typically, only the file system driver that
    334 /// produces the Firmware Volume Protocol will bind to the
    335 /// Firmware Volume Block Protocol.
    336 ///
    337 struct _FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL {
    338   FRAMEWORK_EFI_FVB_GET_ATTRIBUTES        GetAttributes;
    339   FRAMEWORK_EFI_FVB_SET_ATTRIBUTES        SetAttributes;
    340   FRAMEWORK_EFI_FVB_GET_PHYSICAL_ADDRESS  GetPhysicalAddress;
    341   FRAMEWORK_EFI_FVB_GET_BLOCK_SIZE        GetBlockSize;
    342   FRAMEWORK_EFI_FVB_READ                  Read;
    343   FRAMEWORK_EFI_FVB_WRITE                 Write;
    344   FRAMEWORK_EFI_FVB_ERASE_BLOCKS          EraseBlocks;
    345   ///
    346   /// The handle of the parent firmware volume.
    347   ///
    348   EFI_HANDLE                    ParentHandle;
    349 };
    350 
    351 extern EFI_GUID gFramerworkEfiFirmwareVolumeBlockProtocolGuid;
    352 
    353 #endif
    354