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