24.2 Block I/O Protocol Implementations

The implementation of the Block I/O Protocols is typically found in the file Block.c. Appendix A contains a template for a BlockIo.c file for a UEFI Driver. The list of tasks to implement the Block I/O Protocols is as follows:

  • Add global variable for the EFI_BLOCK_IO_PROTOCOL instance to BlockIo.c.

  • Add global variable for the EFI_BLOCK_IO2_PROTOCOL instance to BlockIo.c.

  • Add global variable for the EFI_BLOCK_IO_MODE structure to BlockIo.c.

  • Implement the Block I/O Protocol and Block I/O 2 Protocol services in BlockIo.c.

Example 236, below, shows the protocol interface structure for the Block I/O Protocol and the following Example 237 shows the protocol interface structure for the Block I/O 2 Protocol for reference. These two protocols are very similar and are both composed of four services and a pointer to a structure that provides detailed information on the currently mounted media. The main difference between these two protocols is that the Block I/O 2 Protocol supports non-blocking operations.

Example 236-Block I/O Protocol

typedef struct _EFI_BLOCK_IO_PROTOCOL EFI_BLOCK_IO_PROTOCOL;
///
/// This protocol provides control over block devices.
///
struct _EFI_BLOCK_IO_PROTOCOL {
///
/// The revision to which the block IO interface adheres. All future
/// revisions must be backwards compatible. If a future version is not
/// back wards compatible, it is not the same GUID.
///
UINT64 Revision;
///
/// Pointer to the EFI_BLOCK_IO_MEDIA data for this device.
///
EFI_BLOCK_IO_MEDIA *Media;
EFI_BLOCK_RESET Reset;
EFI_BLOCK_READ ReadBlocks;
EFI_BLOCK_WRITE WriteBlocks;
EFI_BLOCK_FLUSH FlushBlocks;
};
extern EFI_GUID gEfiBlockIoProtocolGuid;

Note: Media must be updated each time that media in the mass storage device is inserted or removed. This allows the consumers of the Block I/O Protocol to retrieve the state of the currently mounted media.

Example 237-Block I/O 2 Protocol

typedef struct _EFI_BLOCK_IO2_PROTOCOL EFI_BLOCK_IO2_PROTOCOL;
///
/// The Block I/O2 protocol defines an extension to the Block I/O protocol which
/// enables the ability to read and write data at a block level in a non-blocking
// manner.
///
struct _EFI_BLOCK_IO2_PROTOCOL {
///
/// A pointer to the EFI_BLOCK_IO_MEDIA data for this device.
/// Type EFI_BLOCK_IO_MEDIA is defined in BlockIo.h.
///
EFI_BLOCK_IO_MEDIA *Media;
EFI_BLOCK_RESET_EX Reset;
EFI_BLOCK_READ_EX ReadBlocksEx;
EFI_BLOCK_WRITE_EX WriteBlocksEx;
EFI_BLOCK_FLUSH_EX FlushBlocksEx;
};
extern EFI_GUID gEfiBlockIo2ProtocolGuid;

Note: Media must be updated each time that that media in the mass storage device is inserted or removed. This allows the consumers of the Block I/O 2 Protocol to retrieve the state of the currently mounted media.