xref: /dflybsd-src/stand/contrib/edk2/MdePkg/Include/Protocol/BlockIo.h (revision 1370a72311f999d5cc5041717aeea26d08ad6923)
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