xref: /DragonOS/kernel/src/driver/block/virtio_blk.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a) !
1731bc2b3SLoGin use core::{any::Any, fmt::Debug};
2731bc2b3SLoGin 
3731bc2b3SLoGin use alloc::{
4731bc2b3SLoGin     string::{String, ToString},
5731bc2b3SLoGin     sync::{Arc, Weak},
6731bc2b3SLoGin     vec::Vec,
7731bc2b3SLoGin };
8*2eab6dd7S曾俊 use log::{debug, error};
9731bc2b3SLoGin use system_error::SystemError;
10731bc2b3SLoGin use unified_init::macros::unified_init;
11731bc2b3SLoGin use virtio_drivers::device::blk::VirtIOBlk;
12731bc2b3SLoGin 
13731bc2b3SLoGin use crate::{
14731bc2b3SLoGin     driver::{
15731bc2b3SLoGin         base::{
16731bc2b3SLoGin             block::{
17731bc2b3SLoGin                 block_device::{BlockDevice, BlockId, LBA_SIZE},
18731bc2b3SLoGin                 disk_info::Partition,
19731bc2b3SLoGin             },
20731bc2b3SLoGin             class::Class,
21731bc2b3SLoGin             device::{
22731bc2b3SLoGin                 bus::Bus,
23731bc2b3SLoGin                 driver::{Driver, DriverCommonData},
24731bc2b3SLoGin                 Device, DeviceCommonData, DeviceId, DeviceType, IdTable,
25731bc2b3SLoGin             },
26731bc2b3SLoGin             kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
27731bc2b3SLoGin             kset::KSet,
28731bc2b3SLoGin         },
29731bc2b3SLoGin         virtio::{
30731bc2b3SLoGin             sysfs::{virtio_bus, virtio_device_manager, virtio_driver_manager},
31731bc2b3SLoGin             transport::VirtIOTransport,
32731bc2b3SLoGin             virtio_impl::HalImpl,
33731bc2b3SLoGin             VirtIODevice, VirtIODeviceIndex, VirtIODriver, VIRTIO_VENDOR_ID,
34731bc2b3SLoGin         },
35731bc2b3SLoGin     },
360102d69fSLoGin     exception::{irqdesc::IrqReturn, IrqNumber},
37731bc2b3SLoGin     filesystem::{kernfs::KernFSInode, mbr::MbrDiskPartionTable},
38731bc2b3SLoGin     init::initcall::INITCALL_POSTCORE,
39731bc2b3SLoGin     libs::{
40731bc2b3SLoGin         rwlock::{RwLockReadGuard, RwLockWriteGuard},
41731bc2b3SLoGin         spinlock::{SpinLock, SpinLockGuard},
42731bc2b3SLoGin     },
43731bc2b3SLoGin };
44731bc2b3SLoGin 
45731bc2b3SLoGin const VIRTIO_BLK_BASENAME: &str = "virtio_blk";
46731bc2b3SLoGin 
47731bc2b3SLoGin static mut VIRTIO_BLK_DRIVER: Option<Arc<VirtIOBlkDriver>> = None;
48731bc2b3SLoGin 
49731bc2b3SLoGin #[inline(always)]
50731bc2b3SLoGin fn virtio_blk_driver() -> Arc<VirtIOBlkDriver> {
51731bc2b3SLoGin     unsafe { VIRTIO_BLK_DRIVER.as_ref().unwrap().clone() }
52731bc2b3SLoGin }
53731bc2b3SLoGin 
54731bc2b3SLoGin /// Get the first virtio block device
55731bc2b3SLoGin #[allow(dead_code)]
56731bc2b3SLoGin pub fn virtio_blk_0() -> Option<Arc<VirtIOBlkDevice>> {
57731bc2b3SLoGin     virtio_blk_driver()
58731bc2b3SLoGin         .devices()
59731bc2b3SLoGin         .first()
60731bc2b3SLoGin         .cloned()
61731bc2b3SLoGin         .map(|dev| dev.arc_any().downcast().unwrap())
62731bc2b3SLoGin }
63731bc2b3SLoGin 
64731bc2b3SLoGin pub fn virtio_blk(transport: VirtIOTransport, dev_id: Arc<DeviceId>) {
65731bc2b3SLoGin     let device = VirtIOBlkDevice::new(transport, dev_id);
66731bc2b3SLoGin     if let Some(device) = device {
67*2eab6dd7S曾俊         debug!("VirtIOBlkDevice '{:?}' created", device.dev_id);
68731bc2b3SLoGin         virtio_device_manager()
69731bc2b3SLoGin             .device_add(device.clone() as Arc<dyn VirtIODevice>)
70731bc2b3SLoGin             .expect("Add virtio blk failed");
71731bc2b3SLoGin     }
72731bc2b3SLoGin }
73731bc2b3SLoGin 
74731bc2b3SLoGin /// virtio block device
75731bc2b3SLoGin #[derive(Debug)]
76731bc2b3SLoGin #[cast_to([sync] VirtIODevice)]
77731bc2b3SLoGin #[cast_to([sync] Device)]
78731bc2b3SLoGin pub struct VirtIOBlkDevice {
79731bc2b3SLoGin     dev_id: Arc<DeviceId>,
80731bc2b3SLoGin     inner: SpinLock<InnerVirtIOBlkDevice>,
81731bc2b3SLoGin     locked_kobj_state: LockedKObjectState,
82731bc2b3SLoGin     self_ref: Weak<Self>,
83731bc2b3SLoGin }
84731bc2b3SLoGin 
85731bc2b3SLoGin unsafe impl Send for VirtIOBlkDevice {}
86731bc2b3SLoGin unsafe impl Sync for VirtIOBlkDevice {}
87731bc2b3SLoGin 
88731bc2b3SLoGin impl VirtIOBlkDevice {
89731bc2b3SLoGin     pub fn new(transport: VirtIOTransport, dev_id: Arc<DeviceId>) -> Option<Arc<Self>> {
900102d69fSLoGin         let irq = transport.irq().map(|irq| IrqNumber::new(irq.data()));
91731bc2b3SLoGin         let device_inner = VirtIOBlk::<HalImpl, VirtIOTransport>::new(transport);
92731bc2b3SLoGin         if let Err(e) = device_inner {
93*2eab6dd7S曾俊             error!("VirtIOBlkDevice '{dev_id:?}' create failed: {:?}", e);
94731bc2b3SLoGin             return None;
95731bc2b3SLoGin         }
96731bc2b3SLoGin 
970102d69fSLoGin         let mut device_inner: VirtIOBlk<HalImpl, VirtIOTransport> = device_inner.unwrap();
980102d69fSLoGin         device_inner.enable_interrupts();
99731bc2b3SLoGin         let dev = Arc::new_cyclic(|self_ref| Self {
100731bc2b3SLoGin             self_ref: self_ref.clone(),
101731bc2b3SLoGin             dev_id,
102731bc2b3SLoGin             locked_kobj_state: LockedKObjectState::default(),
103731bc2b3SLoGin             inner: SpinLock::new(InnerVirtIOBlkDevice {
104731bc2b3SLoGin                 device_inner,
105731bc2b3SLoGin                 name: None,
106731bc2b3SLoGin                 virtio_index: None,
107731bc2b3SLoGin                 device_common: DeviceCommonData::default(),
108731bc2b3SLoGin                 kobject_common: KObjectCommonData::default(),
1090102d69fSLoGin                 irq,
110731bc2b3SLoGin             }),
111731bc2b3SLoGin         });
112731bc2b3SLoGin 
113731bc2b3SLoGin         dev.set_driver(Some(Arc::downgrade(
114731bc2b3SLoGin             &(virtio_blk_driver() as Arc<dyn Driver>),
115731bc2b3SLoGin         )));
116731bc2b3SLoGin 
117731bc2b3SLoGin         Some(dev)
118731bc2b3SLoGin     }
119731bc2b3SLoGin 
120731bc2b3SLoGin     fn inner(&self) -> SpinLockGuard<InnerVirtIOBlkDevice> {
121731bc2b3SLoGin         self.inner.lock()
122731bc2b3SLoGin     }
123731bc2b3SLoGin }
124731bc2b3SLoGin 
125731bc2b3SLoGin impl BlockDevice for VirtIOBlkDevice {
126731bc2b3SLoGin     fn read_at_sync(
127731bc2b3SLoGin         &self,
128731bc2b3SLoGin         lba_id_start: BlockId,
129731bc2b3SLoGin         count: usize,
130731bc2b3SLoGin         buf: &mut [u8],
131731bc2b3SLoGin     ) -> Result<usize, SystemError> {
132731bc2b3SLoGin         let mut inner = self.inner();
133731bc2b3SLoGin 
134731bc2b3SLoGin         inner
135731bc2b3SLoGin             .device_inner
136731bc2b3SLoGin             .read_blocks(lba_id_start, &mut buf[..count * LBA_SIZE])
137731bc2b3SLoGin             .map_err(|e| {
138*2eab6dd7S曾俊                 error!(
139731bc2b3SLoGin                     "VirtIOBlkDevice '{:?}' read_at_sync failed: {:?}",
140*2eab6dd7S曾俊                     self.dev_id, e
141731bc2b3SLoGin                 );
142731bc2b3SLoGin                 SystemError::EIO
143731bc2b3SLoGin             })?;
144731bc2b3SLoGin 
145731bc2b3SLoGin         Ok(count)
146731bc2b3SLoGin     }
147731bc2b3SLoGin 
148731bc2b3SLoGin     fn write_at_sync(
149731bc2b3SLoGin         &self,
150731bc2b3SLoGin         lba_id_start: BlockId,
151731bc2b3SLoGin         count: usize,
152731bc2b3SLoGin         buf: &[u8],
153731bc2b3SLoGin     ) -> Result<usize, SystemError> {
154731bc2b3SLoGin         self.inner()
155731bc2b3SLoGin             .device_inner
156731bc2b3SLoGin             .write_blocks(lba_id_start, &buf[..count * LBA_SIZE])
157731bc2b3SLoGin             .map_err(|_| SystemError::EIO)?;
158731bc2b3SLoGin         Ok(count)
159731bc2b3SLoGin     }
160731bc2b3SLoGin 
161731bc2b3SLoGin     fn sync(&self) -> Result<(), SystemError> {
162731bc2b3SLoGin         Ok(())
163731bc2b3SLoGin     }
164731bc2b3SLoGin 
165731bc2b3SLoGin     fn blk_size_log2(&self) -> u8 {
166731bc2b3SLoGin         9
167731bc2b3SLoGin     }
168731bc2b3SLoGin 
169731bc2b3SLoGin     fn as_any_ref(&self) -> &dyn Any {
170731bc2b3SLoGin         self
171731bc2b3SLoGin     }
172731bc2b3SLoGin 
173731bc2b3SLoGin     fn device(&self) -> Arc<dyn Device> {
174731bc2b3SLoGin         self.self_ref.upgrade().unwrap()
175731bc2b3SLoGin     }
176731bc2b3SLoGin 
177731bc2b3SLoGin     fn block_size(&self) -> usize {
178731bc2b3SLoGin         todo!()
179731bc2b3SLoGin     }
180731bc2b3SLoGin 
181731bc2b3SLoGin     fn partitions(&self) -> Vec<Arc<Partition>> {
182731bc2b3SLoGin         let device = self.self_ref.upgrade().unwrap() as Arc<dyn BlockDevice>;
183731bc2b3SLoGin         let mbr_table = MbrDiskPartionTable::from_disk(device.clone())
184731bc2b3SLoGin             .expect("Failed to get MBR partition table");
185731bc2b3SLoGin         mbr_table.partitions(Arc::downgrade(&device))
186731bc2b3SLoGin     }
187731bc2b3SLoGin }
188731bc2b3SLoGin 
189731bc2b3SLoGin struct InnerVirtIOBlkDevice {
190731bc2b3SLoGin     device_inner: VirtIOBlk<HalImpl, VirtIOTransport>,
191731bc2b3SLoGin     name: Option<String>,
192731bc2b3SLoGin     virtio_index: Option<VirtIODeviceIndex>,
193731bc2b3SLoGin     device_common: DeviceCommonData,
194731bc2b3SLoGin     kobject_common: KObjectCommonData,
1950102d69fSLoGin     irq: Option<IrqNumber>,
196731bc2b3SLoGin }
197731bc2b3SLoGin 
198731bc2b3SLoGin impl Debug for InnerVirtIOBlkDevice {
199731bc2b3SLoGin     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
200731bc2b3SLoGin         f.debug_struct("InnerVirtIOBlkDevice").finish()
201731bc2b3SLoGin     }
202731bc2b3SLoGin }
203731bc2b3SLoGin 
204731bc2b3SLoGin impl VirtIODevice for VirtIOBlkDevice {
2050102d69fSLoGin     fn irq(&self) -> Option<IrqNumber> {
2060102d69fSLoGin         self.inner().irq
2070102d69fSLoGin     }
2080102d69fSLoGin 
209731bc2b3SLoGin     fn handle_irq(
210731bc2b3SLoGin         &self,
211731bc2b3SLoGin         _irq: crate::exception::IrqNumber,
2120102d69fSLoGin     ) -> Result<IrqReturn, system_error::SystemError> {
2130102d69fSLoGin         // todo: handle virtio blk irq
2140102d69fSLoGin         Ok(crate::exception::irqdesc::IrqReturn::Handled)
215731bc2b3SLoGin     }
216731bc2b3SLoGin 
217731bc2b3SLoGin     fn dev_id(&self) -> &Arc<DeviceId> {
218731bc2b3SLoGin         &self.dev_id
219731bc2b3SLoGin     }
220731bc2b3SLoGin 
221731bc2b3SLoGin     fn set_device_name(&self, name: String) {
222731bc2b3SLoGin         self.inner().name = Some(name);
223731bc2b3SLoGin     }
224731bc2b3SLoGin 
225731bc2b3SLoGin     fn device_name(&self) -> String {
226731bc2b3SLoGin         self.inner()
227731bc2b3SLoGin             .name
228731bc2b3SLoGin             .clone()
229731bc2b3SLoGin             .unwrap_or_else(|| VIRTIO_BLK_BASENAME.to_string())
230731bc2b3SLoGin     }
231731bc2b3SLoGin 
232731bc2b3SLoGin     fn set_virtio_device_index(&self, index: VirtIODeviceIndex) {
233731bc2b3SLoGin         self.inner().virtio_index = Some(index);
234731bc2b3SLoGin     }
235731bc2b3SLoGin 
236731bc2b3SLoGin     fn virtio_device_index(&self) -> Option<VirtIODeviceIndex> {
237731bc2b3SLoGin         self.inner().virtio_index
238731bc2b3SLoGin     }
239731bc2b3SLoGin 
240731bc2b3SLoGin     fn device_type_id(&self) -> u32 {
241731bc2b3SLoGin         virtio_drivers::transport::DeviceType::Block as u32
242731bc2b3SLoGin     }
243731bc2b3SLoGin 
244731bc2b3SLoGin     fn vendor(&self) -> u32 {
245731bc2b3SLoGin         VIRTIO_VENDOR_ID.into()
246731bc2b3SLoGin     }
247731bc2b3SLoGin }
248731bc2b3SLoGin 
249731bc2b3SLoGin impl Device for VirtIOBlkDevice {
250731bc2b3SLoGin     fn dev_type(&self) -> DeviceType {
251731bc2b3SLoGin         DeviceType::Net
252731bc2b3SLoGin     }
253731bc2b3SLoGin 
254731bc2b3SLoGin     fn id_table(&self) -> IdTable {
255731bc2b3SLoGin         IdTable::new(VIRTIO_BLK_BASENAME.to_string(), None)
256731bc2b3SLoGin     }
257731bc2b3SLoGin 
258731bc2b3SLoGin     fn bus(&self) -> Option<Weak<dyn Bus>> {
259731bc2b3SLoGin         self.inner().device_common.bus.clone()
260731bc2b3SLoGin     }
261731bc2b3SLoGin 
262731bc2b3SLoGin     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
263731bc2b3SLoGin         self.inner().device_common.bus = bus;
264731bc2b3SLoGin     }
265731bc2b3SLoGin 
266731bc2b3SLoGin     fn class(&self) -> Option<Arc<dyn Class>> {
267731bc2b3SLoGin         let mut guard = self.inner();
268731bc2b3SLoGin         let r = guard.device_common.class.clone()?.upgrade();
269731bc2b3SLoGin         if r.is_none() {
270731bc2b3SLoGin             guard.device_common.class = None;
271731bc2b3SLoGin         }
272731bc2b3SLoGin 
273731bc2b3SLoGin         return r;
274731bc2b3SLoGin     }
275731bc2b3SLoGin 
276731bc2b3SLoGin     fn set_class(&self, class: Option<Weak<dyn Class>>) {
277731bc2b3SLoGin         self.inner().device_common.class = class;
278731bc2b3SLoGin     }
279731bc2b3SLoGin 
280731bc2b3SLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
281731bc2b3SLoGin         let r = self.inner().device_common.driver.clone()?.upgrade();
282731bc2b3SLoGin         if r.is_none() {
283731bc2b3SLoGin             self.inner().device_common.driver = None;
284731bc2b3SLoGin         }
285731bc2b3SLoGin 
286731bc2b3SLoGin         return r;
287731bc2b3SLoGin     }
288731bc2b3SLoGin 
289731bc2b3SLoGin     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
290731bc2b3SLoGin         self.inner().device_common.driver = driver;
291731bc2b3SLoGin     }
292731bc2b3SLoGin 
293731bc2b3SLoGin     fn is_dead(&self) -> bool {
294731bc2b3SLoGin         false
295731bc2b3SLoGin     }
296731bc2b3SLoGin 
297731bc2b3SLoGin     fn can_match(&self) -> bool {
298731bc2b3SLoGin         self.inner().device_common.can_match
299731bc2b3SLoGin     }
300731bc2b3SLoGin 
301731bc2b3SLoGin     fn set_can_match(&self, can_match: bool) {
302731bc2b3SLoGin         self.inner().device_common.can_match = can_match;
303731bc2b3SLoGin     }
304731bc2b3SLoGin 
305731bc2b3SLoGin     fn state_synced(&self) -> bool {
306731bc2b3SLoGin         true
307731bc2b3SLoGin     }
308731bc2b3SLoGin }
309731bc2b3SLoGin 
310731bc2b3SLoGin impl KObject for VirtIOBlkDevice {
311731bc2b3SLoGin     fn as_any_ref(&self) -> &dyn Any {
312731bc2b3SLoGin         self
313731bc2b3SLoGin     }
314731bc2b3SLoGin 
315731bc2b3SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
316731bc2b3SLoGin         self.inner().kobject_common.kern_inode = inode;
317731bc2b3SLoGin     }
318731bc2b3SLoGin 
319731bc2b3SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
320731bc2b3SLoGin         self.inner().kobject_common.kern_inode.clone()
321731bc2b3SLoGin     }
322731bc2b3SLoGin 
323731bc2b3SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
324731bc2b3SLoGin         self.inner().kobject_common.parent.clone()
325731bc2b3SLoGin     }
326731bc2b3SLoGin 
327731bc2b3SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
328731bc2b3SLoGin         self.inner().kobject_common.parent = parent;
329731bc2b3SLoGin     }
330731bc2b3SLoGin 
331731bc2b3SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
332731bc2b3SLoGin         self.inner().kobject_common.kset.clone()
333731bc2b3SLoGin     }
334731bc2b3SLoGin 
335731bc2b3SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
336731bc2b3SLoGin         self.inner().kobject_common.kset = kset;
337731bc2b3SLoGin     }
338731bc2b3SLoGin 
339731bc2b3SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
340731bc2b3SLoGin         self.inner().kobject_common.kobj_type
341731bc2b3SLoGin     }
342731bc2b3SLoGin 
343731bc2b3SLoGin     fn name(&self) -> String {
344731bc2b3SLoGin         self.device_name()
345731bc2b3SLoGin     }
346731bc2b3SLoGin 
347731bc2b3SLoGin     fn set_name(&self, _name: String) {
348731bc2b3SLoGin         // do nothing
349731bc2b3SLoGin     }
350731bc2b3SLoGin 
351731bc2b3SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
352731bc2b3SLoGin         self.locked_kobj_state.read()
353731bc2b3SLoGin     }
354731bc2b3SLoGin 
355731bc2b3SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
356731bc2b3SLoGin         self.locked_kobj_state.write()
357731bc2b3SLoGin     }
358731bc2b3SLoGin 
359731bc2b3SLoGin     fn set_kobj_state(&self, state: KObjectState) {
360731bc2b3SLoGin         *self.locked_kobj_state.write() = state;
361731bc2b3SLoGin     }
362731bc2b3SLoGin 
363731bc2b3SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
364731bc2b3SLoGin         self.inner().kobject_common.kobj_type = ktype;
365731bc2b3SLoGin     }
366731bc2b3SLoGin }
367731bc2b3SLoGin 
368731bc2b3SLoGin #[unified_init(INITCALL_POSTCORE)]
369731bc2b3SLoGin fn virtio_blk_driver_init() -> Result<(), SystemError> {
370731bc2b3SLoGin     let driver = VirtIOBlkDriver::new();
371731bc2b3SLoGin     virtio_driver_manager()
372731bc2b3SLoGin         .register(driver.clone() as Arc<dyn VirtIODriver>)
373731bc2b3SLoGin         .expect("Add virtio net driver failed");
374731bc2b3SLoGin     unsafe {
375731bc2b3SLoGin         VIRTIO_BLK_DRIVER = Some(driver);
376731bc2b3SLoGin     }
377731bc2b3SLoGin 
378731bc2b3SLoGin     return Ok(());
379731bc2b3SLoGin }
380731bc2b3SLoGin 
381731bc2b3SLoGin #[derive(Debug)]
382731bc2b3SLoGin #[cast_to([sync] VirtIODriver)]
383731bc2b3SLoGin #[cast_to([sync] Driver)]
384731bc2b3SLoGin struct VirtIOBlkDriver {
385731bc2b3SLoGin     inner: SpinLock<InnerVirtIOBlkDriver>,
386731bc2b3SLoGin     kobj_state: LockedKObjectState,
387731bc2b3SLoGin }
388731bc2b3SLoGin 
389731bc2b3SLoGin impl VirtIOBlkDriver {
390731bc2b3SLoGin     pub fn new() -> Arc<Self> {
391731bc2b3SLoGin         let inner = InnerVirtIOBlkDriver {
392731bc2b3SLoGin             driver_common: DriverCommonData::default(),
393731bc2b3SLoGin             kobj_common: KObjectCommonData::default(),
394731bc2b3SLoGin         };
395731bc2b3SLoGin         Arc::new(VirtIOBlkDriver {
396731bc2b3SLoGin             inner: SpinLock::new(inner),
397731bc2b3SLoGin             kobj_state: LockedKObjectState::default(),
398731bc2b3SLoGin         })
399731bc2b3SLoGin     }
400731bc2b3SLoGin 
401731bc2b3SLoGin     fn inner(&self) -> SpinLockGuard<InnerVirtIOBlkDriver> {
402731bc2b3SLoGin         return self.inner.lock();
403731bc2b3SLoGin     }
404731bc2b3SLoGin }
405731bc2b3SLoGin 
406731bc2b3SLoGin #[derive(Debug)]
407731bc2b3SLoGin struct InnerVirtIOBlkDriver {
408731bc2b3SLoGin     driver_common: DriverCommonData,
409731bc2b3SLoGin     kobj_common: KObjectCommonData,
410731bc2b3SLoGin }
411731bc2b3SLoGin 
412731bc2b3SLoGin impl VirtIODriver for VirtIOBlkDriver {
413731bc2b3SLoGin     fn probe(&self, device: &Arc<dyn VirtIODevice>) -> Result<(), SystemError> {
414731bc2b3SLoGin         let _dev = device
415731bc2b3SLoGin             .clone()
416731bc2b3SLoGin             .arc_any()
417731bc2b3SLoGin             .downcast::<VirtIOBlkDevice>()
418731bc2b3SLoGin             .map_err(|_| {
419*2eab6dd7S曾俊                 error!(
420731bc2b3SLoGin                 "VirtIOBlkDriver::probe() failed: device is not a VirtIO block device. Device: '{:?}'",
421731bc2b3SLoGin                 device.name()
422731bc2b3SLoGin             );
423731bc2b3SLoGin                 SystemError::EINVAL
424731bc2b3SLoGin             })?;
425731bc2b3SLoGin 
426731bc2b3SLoGin         return Ok(());
427731bc2b3SLoGin     }
428731bc2b3SLoGin }
429731bc2b3SLoGin 
430731bc2b3SLoGin impl Driver for VirtIOBlkDriver {
431731bc2b3SLoGin     fn id_table(&self) -> Option<IdTable> {
432731bc2b3SLoGin         Some(IdTable::new(VIRTIO_BLK_BASENAME.to_string(), None))
433731bc2b3SLoGin     }
434731bc2b3SLoGin 
435731bc2b3SLoGin     fn add_device(&self, device: Arc<dyn Device>) {
436731bc2b3SLoGin         let iface = device
437731bc2b3SLoGin             .arc_any()
438731bc2b3SLoGin             .downcast::<VirtIOBlkDevice>()
439731bc2b3SLoGin             .expect("VirtIOBlkDriver::add_device() failed: device is not a VirtIOBlkDevice");
440731bc2b3SLoGin 
441731bc2b3SLoGin         self.inner()
442731bc2b3SLoGin             .driver_common
443731bc2b3SLoGin             .devices
444731bc2b3SLoGin             .push(iface as Arc<dyn Device>);
445731bc2b3SLoGin     }
446731bc2b3SLoGin 
447731bc2b3SLoGin     fn delete_device(&self, device: &Arc<dyn Device>) {
448731bc2b3SLoGin         let _iface = device
449731bc2b3SLoGin             .clone()
450731bc2b3SLoGin             .arc_any()
451731bc2b3SLoGin             .downcast::<VirtIOBlkDevice>()
452731bc2b3SLoGin             .expect("VirtIOBlkDriver::delete_device() failed: device is not a VirtIOBlkDevice");
453731bc2b3SLoGin 
454731bc2b3SLoGin         let mut guard = self.inner();
455731bc2b3SLoGin         let index = guard
456731bc2b3SLoGin             .driver_common
457731bc2b3SLoGin             .devices
458731bc2b3SLoGin             .iter()
459731bc2b3SLoGin             .position(|dev| Arc::ptr_eq(device, dev))
460731bc2b3SLoGin             .expect("VirtIOBlkDriver::delete_device() failed: device not found");
461731bc2b3SLoGin 
462731bc2b3SLoGin         guard.driver_common.devices.remove(index);
463731bc2b3SLoGin     }
464731bc2b3SLoGin 
465731bc2b3SLoGin     fn devices(&self) -> Vec<Arc<dyn Device>> {
466731bc2b3SLoGin         self.inner().driver_common.devices.clone()
467731bc2b3SLoGin     }
468731bc2b3SLoGin 
469731bc2b3SLoGin     fn bus(&self) -> Option<Weak<dyn Bus>> {
470731bc2b3SLoGin         Some(Arc::downgrade(&virtio_bus()) as Weak<dyn Bus>)
471731bc2b3SLoGin     }
472731bc2b3SLoGin 
473731bc2b3SLoGin     fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
474731bc2b3SLoGin         // do nothing
475731bc2b3SLoGin     }
476731bc2b3SLoGin }
477731bc2b3SLoGin 
478731bc2b3SLoGin impl KObject for VirtIOBlkDriver {
479731bc2b3SLoGin     fn as_any_ref(&self) -> &dyn Any {
480731bc2b3SLoGin         self
481731bc2b3SLoGin     }
482731bc2b3SLoGin 
483731bc2b3SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
484731bc2b3SLoGin         self.inner().kobj_common.kern_inode = inode;
485731bc2b3SLoGin     }
486731bc2b3SLoGin 
487731bc2b3SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
488731bc2b3SLoGin         self.inner().kobj_common.kern_inode.clone()
489731bc2b3SLoGin     }
490731bc2b3SLoGin 
491731bc2b3SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
492731bc2b3SLoGin         self.inner().kobj_common.parent.clone()
493731bc2b3SLoGin     }
494731bc2b3SLoGin 
495731bc2b3SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
496731bc2b3SLoGin         self.inner().kobj_common.parent = parent;
497731bc2b3SLoGin     }
498731bc2b3SLoGin 
499731bc2b3SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
500731bc2b3SLoGin         self.inner().kobj_common.kset.clone()
501731bc2b3SLoGin     }
502731bc2b3SLoGin 
503731bc2b3SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
504731bc2b3SLoGin         self.inner().kobj_common.kset = kset;
505731bc2b3SLoGin     }
506731bc2b3SLoGin 
507731bc2b3SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
508731bc2b3SLoGin         self.inner().kobj_common.kobj_type
509731bc2b3SLoGin     }
510731bc2b3SLoGin 
511731bc2b3SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
512731bc2b3SLoGin         self.inner().kobj_common.kobj_type = ktype;
513731bc2b3SLoGin     }
514731bc2b3SLoGin 
515731bc2b3SLoGin     fn name(&self) -> String {
516731bc2b3SLoGin         VIRTIO_BLK_BASENAME.to_string()
517731bc2b3SLoGin     }
518731bc2b3SLoGin 
519731bc2b3SLoGin     fn set_name(&self, _name: String) {
520731bc2b3SLoGin         // do nothing
521731bc2b3SLoGin     }
522731bc2b3SLoGin 
523731bc2b3SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
524731bc2b3SLoGin         self.kobj_state.read()
525731bc2b3SLoGin     }
526731bc2b3SLoGin 
527731bc2b3SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
528731bc2b3SLoGin         self.kobj_state.write()
529731bc2b3SLoGin     }
530731bc2b3SLoGin 
531731bc2b3SLoGin     fn set_kobj_state(&self, state: KObjectState) {
532731bc2b3SLoGin         *self.kobj_state.write() = state;
533731bc2b3SLoGin     }
534731bc2b3SLoGin }
535