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
7pub 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 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}