1 use crate::{guid, Guid, Status};
2 use core::ffi::c_void;
3 
4 /// Logical block address.
5 pub type Lba = u64;
6 
7 /// Media information structure
8 #[repr(C)]
9 #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
10 pub struct BlockIoMedia {
11     pub media_id: u32,
12     pub removable_media: bool,
13     pub media_present: bool,
14     pub logical_partition: bool,
15     pub read_only: bool,
16     pub write_caching: bool,
17     pub block_size: u32,
18     pub io_align: u32,
19     pub last_block: Lba,
20 
21     // Added in revision 2.
22     pub lowest_aligned_lba: Lba,
23     pub logical_blocks_per_physical_block: u32,
24 
25     // Added in revision 3.
26     pub optimal_transfer_length_granularity: u32,
27 }
28 
29 #[derive(Debug)]
30 #[repr(C)]
31 pub struct BlockIoProtocol {
32     pub revision: u64,
33     pub media: *const BlockIoMedia,
34     pub reset: unsafe extern "efiapi" fn(this: *mut Self, extended_verification: bool) -> Status,
35     pub read_blocks: unsafe extern "efiapi" fn(
36         this: *const Self,
37         media_id: u32,
38         lba: Lba,
39         buffer_size: usize,
40         buffer: *mut c_void,
41     ) -> Status,
42     pub write_blocks: unsafe extern "efiapi" fn(
43         this: *mut Self,
44         media_id: u32,
45         lba: Lba,
46         buffer_size: usize,
47         buffer: *const c_void,
48     ) -> Status,
49     pub flush_blocks: unsafe extern "efiapi" fn(this: *mut Self) -> Status,
50 }
51 
52 impl BlockIoProtocol {
53     pub const GUID: Guid = guid!("964e5b21-6459-11d2-8e39-00a0c969723b");
54 }
55