Skip to main content

axdriver_virtio/
blk.rs

1use axdriver_base::{BaseDriverOps, DevResult, DeviceType};
2use axdriver_block::BlockDriverOps;
3use virtio_drivers::{Hal, device::blk::VirtIOBlk as InnerDev, transport::Transport};
4
5use crate::as_dev_err;
6
7/// The VirtIO block device driver.
8pub struct VirtIoBlkDev<H: Hal, T: Transport> {
9    inner: InnerDev<H, T>,
10}
11
12unsafe impl<H: Hal, T: Transport> Send for VirtIoBlkDev<H, T> {}
13unsafe impl<H: Hal, T: Transport> Sync for VirtIoBlkDev<H, T> {}
14
15impl<H: Hal, T: Transport> VirtIoBlkDev<H, T> {
16    /// Creates a new driver instance and initializes the device, or returns
17    /// an error if any step fails.
18    pub fn try_new(transport: T) -> DevResult<Self> {
19        Ok(Self {
20            inner: InnerDev::new(transport).map_err(as_dev_err)?,
21        })
22    }
23}
24
25impl<H: Hal, T: Transport> BaseDriverOps for VirtIoBlkDev<H, T> {
26    fn device_name(&self) -> &str {
27        "virtio-blk"
28    }
29
30    fn device_type(&self) -> DeviceType {
31        DeviceType::Block
32    }
33}
34
35impl<H: Hal, T: Transport> BlockDriverOps for VirtIoBlkDev<H, T> {
36    #[inline]
37    fn num_blocks(&self) -> u64 {
38        self.inner.capacity()
39    }
40
41    #[inline]
42    fn block_size(&self) -> usize {
43        virtio_drivers::device::blk::SECTOR_SIZE
44    }
45
46    fn read_block(&mut self, block_id: u64, buf: &mut [u8]) -> DevResult {
47        self.inner
48            .read_blocks(block_id as _, buf)
49            .map_err(as_dev_err)
50    }
51
52    fn write_block(&mut self, block_id: u64, buf: &[u8]) -> DevResult {
53        self.inner
54            .write_blocks(block_id as _, buf)
55            .map_err(as_dev_err)
56    }
57
58    fn flush(&mut self) -> DevResult {
59        Ok(())
60    }
61}