1*1370a723SSascha Wildner /** @file 2*1370a723SSascha Wildner Block IO protocol as defined in the UEFI 2.0 specification. 3*1370a723SSascha Wildner 4*1370a723SSascha Wildner The Block IO protocol is used to abstract block devices like hard drives, 5*1370a723SSascha Wildner DVD-ROMs and floppy drives. 6*1370a723SSascha Wildner 7*1370a723SSascha Wildner Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> 8*1370a723SSascha Wildner SPDX-License-Identifier: BSD-2-Clause-Patent 9*1370a723SSascha Wildner 10*1370a723SSascha Wildner **/ 11*1370a723SSascha Wildner 12*1370a723SSascha Wildner #ifndef __BLOCK_IO_H__ 13*1370a723SSascha Wildner #define __BLOCK_IO_H__ 14*1370a723SSascha Wildner 15*1370a723SSascha Wildner #define EFI_BLOCK_IO_PROTOCOL_GUID \ 16*1370a723SSascha Wildner { \ 17*1370a723SSascha Wildner 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ 18*1370a723SSascha Wildner } 19*1370a723SSascha Wildner 20*1370a723SSascha Wildner typedef struct _EFI_BLOCK_IO_PROTOCOL EFI_BLOCK_IO_PROTOCOL; 21*1370a723SSascha Wildner 22*1370a723SSascha Wildner /// 23*1370a723SSascha Wildner /// Protocol GUID name defined in EFI1.1. 24*1370a723SSascha Wildner /// 25*1370a723SSascha Wildner #define BLOCK_IO_PROTOCOL EFI_BLOCK_IO_PROTOCOL_GUID 26*1370a723SSascha Wildner 27*1370a723SSascha Wildner /// 28*1370a723SSascha Wildner /// Protocol defined in EFI1.1. 29*1370a723SSascha Wildner /// 30*1370a723SSascha Wildner typedef EFI_BLOCK_IO_PROTOCOL EFI_BLOCK_IO; 31*1370a723SSascha Wildner 32*1370a723SSascha Wildner /** 33*1370a723SSascha Wildner Reset the Block Device. 34*1370a723SSascha Wildner 35*1370a723SSascha Wildner @param This Indicates a pointer to the calling context. 36*1370a723SSascha Wildner @param ExtendedVerification Driver may perform diagnostics on reset. 37*1370a723SSascha Wildner 38*1370a723SSascha Wildner @retval EFI_SUCCESS The device was reset. 39*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device is not functioning properly and could 40*1370a723SSascha Wildner not be reset. 41*1370a723SSascha Wildner 42*1370a723SSascha Wildner **/ 43*1370a723SSascha Wildner typedef 44*1370a723SSascha Wildner EFI_STATUS 45*1370a723SSascha Wildner (EFIAPI *EFI_BLOCK_RESET)( 46*1370a723SSascha Wildner IN EFI_BLOCK_IO_PROTOCOL *This, 47*1370a723SSascha Wildner IN BOOLEAN ExtendedVerification 48*1370a723SSascha Wildner ); 49*1370a723SSascha Wildner 50*1370a723SSascha Wildner /** 51*1370a723SSascha Wildner Read BufferSize bytes from Lba into Buffer. 52*1370a723SSascha Wildner 53*1370a723SSascha Wildner @param This Indicates a pointer to the calling context. 54*1370a723SSascha Wildner @param MediaId Id of the media, changes every time the media is replaced. 55*1370a723SSascha Wildner @param Lba The starting Logical Block Address to read from 56*1370a723SSascha Wildner @param BufferSize Size of Buffer, must be a multiple of device block size. 57*1370a723SSascha Wildner @param Buffer A pointer to the destination buffer for the data. The caller is 58*1370a723SSascha Wildner responsible for either having implicit or explicit ownership of the buffer. 59*1370a723SSascha Wildner 60*1370a723SSascha Wildner @retval EFI_SUCCESS The data was read correctly from the device. 61*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device reported an error while performing the read. 62*1370a723SSascha Wildner @retval EFI_NO_MEDIA There is no media in the device. 63*1370a723SSascha Wildner @retval EFI_MEDIA_CHANGED The MediaId does not matched the current device. 64*1370a723SSascha Wildner @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 65*1370a723SSascha Wildner @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, 66*1370a723SSascha Wildner or the buffer is not on proper alignment. 67*1370a723SSascha Wildner 68*1370a723SSascha Wildner **/ 69*1370a723SSascha Wildner typedef 70*1370a723SSascha Wildner EFI_STATUS 71*1370a723SSascha Wildner (EFIAPI *EFI_BLOCK_READ)( 72*1370a723SSascha Wildner IN EFI_BLOCK_IO_PROTOCOL *This, 73*1370a723SSascha Wildner IN UINT32 MediaId, 74*1370a723SSascha Wildner IN EFI_LBA Lba, 75*1370a723SSascha Wildner IN UINTN BufferSize, 76*1370a723SSascha Wildner OUT VOID *Buffer 77*1370a723SSascha Wildner ); 78*1370a723SSascha Wildner 79*1370a723SSascha Wildner /** 80*1370a723SSascha Wildner Write BufferSize bytes from Lba into Buffer. 81*1370a723SSascha Wildner 82*1370a723SSascha Wildner @param This Indicates a pointer to the calling context. 83*1370a723SSascha Wildner @param MediaId The media ID that the write request is for. 84*1370a723SSascha Wildner @param Lba The starting logical block address to be written. The caller is 85*1370a723SSascha Wildner responsible for writing to only legitimate locations. 86*1370a723SSascha Wildner @param BufferSize Size of Buffer, must be a multiple of device block size. 87*1370a723SSascha Wildner @param Buffer A pointer to the source buffer for the data. 88*1370a723SSascha Wildner 89*1370a723SSascha Wildner @retval EFI_SUCCESS The data was written correctly to the device. 90*1370a723SSascha Wildner @retval EFI_WRITE_PROTECTED The device can not be written to. 91*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device reported an error while performing the write. 92*1370a723SSascha Wildner @retval EFI_NO_MEDIA There is no media in the device. 93*1370a723SSascha Wildner @retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device. 94*1370a723SSascha Wildner @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device. 95*1370a723SSascha Wildner @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid, 96*1370a723SSascha Wildner or the buffer is not on proper alignment. 97*1370a723SSascha Wildner 98*1370a723SSascha Wildner **/ 99*1370a723SSascha Wildner typedef 100*1370a723SSascha Wildner EFI_STATUS 101*1370a723SSascha Wildner (EFIAPI *EFI_BLOCK_WRITE)( 102*1370a723SSascha Wildner IN EFI_BLOCK_IO_PROTOCOL *This, 103*1370a723SSascha Wildner IN UINT32 MediaId, 104*1370a723SSascha Wildner IN EFI_LBA Lba, 105*1370a723SSascha Wildner IN UINTN BufferSize, 106*1370a723SSascha Wildner IN VOID *Buffer 107*1370a723SSascha Wildner ); 108*1370a723SSascha Wildner 109*1370a723SSascha Wildner /** 110*1370a723SSascha Wildner Flush the Block Device. 111*1370a723SSascha Wildner 112*1370a723SSascha Wildner @param This Indicates a pointer to the calling context. 113*1370a723SSascha Wildner 114*1370a723SSascha Wildner @retval EFI_SUCCESS All outstanding data was written to the device 115*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device reported an error while writting back the data 116*1370a723SSascha Wildner @retval EFI_NO_MEDIA There is no media in the device. 117*1370a723SSascha Wildner 118*1370a723SSascha Wildner **/ 119*1370a723SSascha Wildner typedef 120*1370a723SSascha Wildner EFI_STATUS 121*1370a723SSascha Wildner (EFIAPI *EFI_BLOCK_FLUSH)( 122*1370a723SSascha Wildner IN EFI_BLOCK_IO_PROTOCOL *This 123*1370a723SSascha Wildner ); 124*1370a723SSascha Wildner 125*1370a723SSascha Wildner /** 126*1370a723SSascha Wildner Block IO read only mode data and updated only via members of BlockIO 127*1370a723SSascha Wildner **/ 128*1370a723SSascha Wildner typedef struct { 129*1370a723SSascha Wildner /// 130*1370a723SSascha Wildner /// The curent media Id. If the media changes, this value is changed. 131*1370a723SSascha Wildner /// 132*1370a723SSascha Wildner UINT32 MediaId; 133*1370a723SSascha Wildner 134*1370a723SSascha Wildner /// 135*1370a723SSascha Wildner /// TRUE if the media is removable; otherwise, FALSE. 136*1370a723SSascha Wildner /// 137*1370a723SSascha Wildner BOOLEAN RemovableMedia; 138*1370a723SSascha Wildner 139*1370a723SSascha Wildner /// 140*1370a723SSascha Wildner /// TRUE if there is a media currently present in the device; 141*1370a723SSascha Wildner /// othersise, FALSE. THis field shows the media present status 142*1370a723SSascha Wildner /// as of the most recent ReadBlocks() or WriteBlocks() call. 143*1370a723SSascha Wildner /// 144*1370a723SSascha Wildner BOOLEAN MediaPresent; 145*1370a723SSascha Wildner 146*1370a723SSascha Wildner /// 147*1370a723SSascha Wildner /// TRUE if LBA 0 is the first block of a partition; otherwise 148*1370a723SSascha Wildner /// FALSE. For media with only one partition this would be TRUE. 149*1370a723SSascha Wildner /// 150*1370a723SSascha Wildner BOOLEAN LogicalPartition; 151*1370a723SSascha Wildner 152*1370a723SSascha Wildner /// 153*1370a723SSascha Wildner /// TRUE if the media is marked read-only otherwise, FALSE. 154*1370a723SSascha Wildner /// This field shows the read-only status as of the most recent WriteBlocks () call. 155*1370a723SSascha Wildner /// 156*1370a723SSascha Wildner BOOLEAN ReadOnly; 157*1370a723SSascha Wildner 158*1370a723SSascha Wildner /// 159*1370a723SSascha Wildner /// TRUE if the WriteBlock () function caches write data. 160*1370a723SSascha Wildner /// 161*1370a723SSascha Wildner BOOLEAN WriteCaching; 162*1370a723SSascha Wildner 163*1370a723SSascha Wildner /// 164*1370a723SSascha Wildner /// The intrinsic block size of the device. If the media changes, then 165*1370a723SSascha Wildner /// this field is updated. 166*1370a723SSascha Wildner /// 167*1370a723SSascha Wildner UINT32 BlockSize; 168*1370a723SSascha Wildner 169*1370a723SSascha Wildner /// 170*1370a723SSascha Wildner /// Supplies the alignment requirement for any buffer to read or write block(s). 171*1370a723SSascha Wildner /// 172*1370a723SSascha Wildner UINT32 IoAlign; 173*1370a723SSascha Wildner 174*1370a723SSascha Wildner /// 175*1370a723SSascha Wildner /// The last logical block address on the device. 176*1370a723SSascha Wildner /// If the media changes, then this field is updated. 177*1370a723SSascha Wildner /// 178*1370a723SSascha Wildner EFI_LBA LastBlock; 179*1370a723SSascha Wildner 180*1370a723SSascha Wildner /// 181*1370a723SSascha Wildner /// Only present if EFI_BLOCK_IO_PROTOCOL.Revision is greater than or equal to 182*1370a723SSascha Wildner /// EFI_BLOCK_IO_PROTOCOL_REVISION2. Returns the first LBA is aligned to 183*1370a723SSascha Wildner /// a physical block boundary. 184*1370a723SSascha Wildner /// 185*1370a723SSascha Wildner EFI_LBA LowestAlignedLba; 186*1370a723SSascha Wildner 187*1370a723SSascha Wildner /// 188*1370a723SSascha Wildner /// Only present if EFI_BLOCK_IO_PROTOCOL.Revision is greater than or equal to 189*1370a723SSascha Wildner /// EFI_BLOCK_IO_PROTOCOL_REVISION2. Returns the number of logical blocks 190*1370a723SSascha Wildner /// per physical block. 191*1370a723SSascha Wildner /// 192*1370a723SSascha Wildner UINT32 LogicalBlocksPerPhysicalBlock; 193*1370a723SSascha Wildner 194*1370a723SSascha Wildner /// 195*1370a723SSascha Wildner /// Only present if EFI_BLOCK_IO_PROTOCOL.Revision is greater than or equal to 196*1370a723SSascha Wildner /// EFI_BLOCK_IO_PROTOCOL_REVISION3. Returns the optimal transfer length 197*1370a723SSascha Wildner /// granularity as a number of logical blocks. 198*1370a723SSascha Wildner /// 199*1370a723SSascha Wildner UINT32 OptimalTransferLengthGranularity; 200*1370a723SSascha Wildner } EFI_BLOCK_IO_MEDIA; 201*1370a723SSascha Wildner 202*1370a723SSascha Wildner #define EFI_BLOCK_IO_PROTOCOL_REVISION 0x00010000 203*1370a723SSascha Wildner #define EFI_BLOCK_IO_PROTOCOL_REVISION2 0x00020001 204*1370a723SSascha Wildner #define EFI_BLOCK_IO_PROTOCOL_REVISION3 0x0002001F 205*1370a723SSascha Wildner 206*1370a723SSascha Wildner /// 207*1370a723SSascha Wildner /// Revision defined in EFI1.1. 208*1370a723SSascha Wildner /// 209*1370a723SSascha Wildner #define EFI_BLOCK_IO_INTERFACE_REVISION EFI_BLOCK_IO_PROTOCOL_REVISION 210*1370a723SSascha Wildner 211*1370a723SSascha Wildner /// 212*1370a723SSascha Wildner /// This protocol provides control over block devices. 213*1370a723SSascha Wildner /// 214*1370a723SSascha Wildner struct _EFI_BLOCK_IO_PROTOCOL { 215*1370a723SSascha Wildner /// 216*1370a723SSascha Wildner /// The revision to which the block IO interface adheres. All future 217*1370a723SSascha Wildner /// revisions must be backwards compatible. If a future version is not 218*1370a723SSascha Wildner /// back wards compatible, it is not the same GUID. 219*1370a723SSascha Wildner /// 220*1370a723SSascha Wildner UINT64 Revision; 221*1370a723SSascha Wildner /// 222*1370a723SSascha Wildner /// Pointer to the EFI_BLOCK_IO_MEDIA data for this device. 223*1370a723SSascha Wildner /// 224*1370a723SSascha Wildner EFI_BLOCK_IO_MEDIA *Media; 225*1370a723SSascha Wildner 226*1370a723SSascha Wildner EFI_BLOCK_RESET Reset; 227*1370a723SSascha Wildner EFI_BLOCK_READ ReadBlocks; 228*1370a723SSascha Wildner EFI_BLOCK_WRITE WriteBlocks; 229*1370a723SSascha Wildner EFI_BLOCK_FLUSH FlushBlocks; 230*1370a723SSascha Wildner }; 231*1370a723SSascha Wildner 232*1370a723SSascha Wildner extern EFI_GUID gEfiBlockIoProtocolGuid; 233*1370a723SSascha Wildner 234*1370a723SSascha Wildner #endif 235