1*1f4877a4S曾俊 use alloc::{ 2*1f4877a4S曾俊 string::{String, ToString}, 3*1f4877a4S曾俊 sync::{Arc, Weak}, 4*1f4877a4S曾俊 vec::Vec, 5*1f4877a4S曾俊 }; 6*1f4877a4S曾俊 7*1f4877a4S曾俊 use crate::{ 8*1f4877a4S曾俊 driver::{ 9*1f4877a4S曾俊 base::{ 10*1f4877a4S曾俊 device::{ 11*1f4877a4S曾俊 bus::Bus, 12*1f4877a4S曾俊 driver::{Driver, DriverCommonData}, 13*1f4877a4S曾俊 Device, IdTable, 14*1f4877a4S曾俊 }, 15*1f4877a4S曾俊 kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState}, 16*1f4877a4S曾俊 kset::KSet, 17*1f4877a4S曾俊 }, 18*1f4877a4S曾俊 pci::{dev_id::PciDeviceID, device::PciDevice, driver::PciDriver}, 19*1f4877a4S曾俊 }, 20*1f4877a4S曾俊 filesystem::kernfs::KernFSInode, 21*1f4877a4S曾俊 libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}, 22*1f4877a4S曾俊 }; 23*1f4877a4S曾俊 #[derive(Debug)] 24*1f4877a4S曾俊 #[cast_to([sync] PciDriver)] 25*1f4877a4S曾俊 pub struct TestDriver { 26*1f4877a4S曾俊 driver_data: RwLock<DriverCommonData>, 27*1f4877a4S曾俊 kobj_data: RwLock<KObjectCommonData>, 28*1f4877a4S曾俊 kobj_state: LockedKObjectState, 29*1f4877a4S曾俊 pub locked_dynid_list: RwLock<Vec<Arc<PciDeviceID>>>, 30*1f4877a4S曾俊 } 31*1f4877a4S曾俊 32*1f4877a4S曾俊 /// # 结构功能 33*1f4877a4S曾俊 /// 本结构体是测试用的驱动,目前暂时保留,否则将出现大量dead code 34*1f4877a4S曾俊 /// 在编写了实际的pci驱动后,可将该驱动删除 35*1f4877a4S曾俊 impl TestDriver { new() -> Self36*1f4877a4S曾俊 pub fn new() -> Self { 37*1f4877a4S曾俊 Self { 38*1f4877a4S曾俊 driver_data: RwLock::new(DriverCommonData::default()), 39*1f4877a4S曾俊 kobj_data: RwLock::new(KObjectCommonData::default()), 40*1f4877a4S曾俊 kobj_state: LockedKObjectState::new(None), 41*1f4877a4S曾俊 locked_dynid_list: RwLock::new(vec![]), 42*1f4877a4S曾俊 } 43*1f4877a4S曾俊 } 44*1f4877a4S曾俊 } 45*1f4877a4S曾俊 46*1f4877a4S曾俊 impl PciDriver for TestDriver { add_dynid(&mut self, id: PciDeviceID) -> Result<(), system_error::SystemError>47*1f4877a4S曾俊 fn add_dynid(&mut self, id: PciDeviceID) -> Result<(), system_error::SystemError> { 48*1f4877a4S曾俊 let id = Arc::new(id); 49*1f4877a4S曾俊 self.locked_dynid_list.write().push(id); 50*1f4877a4S曾俊 Ok(()) 51*1f4877a4S曾俊 } 52*1f4877a4S曾俊 locked_dynid_list(&self) -> Option<Vec<Arc<PciDeviceID>>>53*1f4877a4S曾俊 fn locked_dynid_list(&self) -> Option<Vec<Arc<PciDeviceID>>> { 54*1f4877a4S曾俊 Some(self.locked_dynid_list.read().clone()) 55*1f4877a4S曾俊 } 56*1f4877a4S曾俊 probe( &self, _device: &Arc<dyn PciDevice>, _id: &PciDeviceID, ) -> Result<(), system_error::SystemError>57*1f4877a4S曾俊 fn probe( 58*1f4877a4S曾俊 &self, 59*1f4877a4S曾俊 _device: &Arc<dyn PciDevice>, 60*1f4877a4S曾俊 _id: &PciDeviceID, 61*1f4877a4S曾俊 ) -> Result<(), system_error::SystemError> { 62*1f4877a4S曾俊 Ok(()) 63*1f4877a4S曾俊 } 64*1f4877a4S曾俊 remove(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError>65*1f4877a4S曾俊 fn remove(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> { 66*1f4877a4S曾俊 Ok(()) 67*1f4877a4S曾俊 } 68*1f4877a4S曾俊 resume(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError>69*1f4877a4S曾俊 fn resume(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> { 70*1f4877a4S曾俊 Ok(()) 71*1f4877a4S曾俊 } 72*1f4877a4S曾俊 shutdown(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError>73*1f4877a4S曾俊 fn shutdown(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> { 74*1f4877a4S曾俊 Ok(()) 75*1f4877a4S曾俊 } 76*1f4877a4S曾俊 suspend(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError>77*1f4877a4S曾俊 fn suspend(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> { 78*1f4877a4S曾俊 Ok(()) 79*1f4877a4S曾俊 } 80*1f4877a4S曾俊 } 81*1f4877a4S曾俊 82*1f4877a4S曾俊 impl Driver for TestDriver { id_table(&self) -> Option<IdTable>83*1f4877a4S曾俊 fn id_table(&self) -> Option<IdTable> { 84*1f4877a4S曾俊 Some(IdTable::new("PciTestDriver".to_string(), None)) 85*1f4877a4S曾俊 } 86*1f4877a4S曾俊 devices(&self) -> Vec<Arc<dyn Device>>87*1f4877a4S曾俊 fn devices(&self) -> Vec<Arc<dyn Device>> { 88*1f4877a4S曾俊 self.driver_data.read().devices.clone() 89*1f4877a4S曾俊 } 90*1f4877a4S曾俊 add_device(&self, device: Arc<dyn Device>)91*1f4877a4S曾俊 fn add_device(&self, device: Arc<dyn Device>) { 92*1f4877a4S曾俊 let mut guard = self.driver_data.write(); 93*1f4877a4S曾俊 // check if the device is already in the list 94*1f4877a4S曾俊 if guard.devices.iter().any(|dev| Arc::ptr_eq(dev, &device)) { 95*1f4877a4S曾俊 return; 96*1f4877a4S曾俊 } 97*1f4877a4S曾俊 98*1f4877a4S曾俊 guard.devices.push(device); 99*1f4877a4S曾俊 } 100*1f4877a4S曾俊 delete_device(&self, device: &Arc<dyn Device>)101*1f4877a4S曾俊 fn delete_device(&self, device: &Arc<dyn Device>) { 102*1f4877a4S曾俊 let mut guard = self.driver_data.write(); 103*1f4877a4S曾俊 guard.devices.retain(|dev| !Arc::ptr_eq(dev, device)); 104*1f4877a4S曾俊 } 105*1f4877a4S曾俊 set_bus(&self, bus: Option<Weak<dyn Bus>>)106*1f4877a4S曾俊 fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 107*1f4877a4S曾俊 self.driver_data.write().bus = bus; 108*1f4877a4S曾俊 } 109*1f4877a4S曾俊 bus(&self) -> Option<Weak<dyn Bus>>110*1f4877a4S曾俊 fn bus(&self) -> Option<Weak<dyn Bus>> { 111*1f4877a4S曾俊 self.driver_data.read().bus.clone() 112*1f4877a4S曾俊 } 113*1f4877a4S曾俊 } 114*1f4877a4S曾俊 115*1f4877a4S曾俊 impl KObject for TestDriver { as_any_ref(&self) -> &dyn core::any::Any116*1f4877a4S曾俊 fn as_any_ref(&self) -> &dyn core::any::Any { 117*1f4877a4S曾俊 self 118*1f4877a4S曾俊 } 119*1f4877a4S曾俊 set_inode(&self, inode: Option<Arc<KernFSInode>>)120*1f4877a4S曾俊 fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 121*1f4877a4S曾俊 self.kobj_data.write().kern_inode = inode; 122*1f4877a4S曾俊 } 123*1f4877a4S曾俊 inode(&self) -> Option<Arc<KernFSInode>>124*1f4877a4S曾俊 fn inode(&self) -> Option<Arc<KernFSInode>> { 125*1f4877a4S曾俊 self.kobj_data.read().kern_inode.clone() 126*1f4877a4S曾俊 } 127*1f4877a4S曾俊 parent(&self) -> Option<Weak<dyn KObject>>128*1f4877a4S曾俊 fn parent(&self) -> Option<Weak<dyn KObject>> { 129*1f4877a4S曾俊 self.kobj_data.read().parent.clone() 130*1f4877a4S曾俊 } 131*1f4877a4S曾俊 set_parent(&self, parent: Option<Weak<dyn KObject>>)132*1f4877a4S曾俊 fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 133*1f4877a4S曾俊 self.kobj_data.write().parent = parent; 134*1f4877a4S曾俊 } 135*1f4877a4S曾俊 kset(&self) -> Option<Arc<KSet>>136*1f4877a4S曾俊 fn kset(&self) -> Option<Arc<KSet>> { 137*1f4877a4S曾俊 self.kobj_data.read().kset.clone() 138*1f4877a4S曾俊 } 139*1f4877a4S曾俊 set_kset(&self, kset: Option<Arc<KSet>>)140*1f4877a4S曾俊 fn set_kset(&self, kset: Option<Arc<KSet>>) { 141*1f4877a4S曾俊 self.kobj_data.write().kset = kset; 142*1f4877a4S曾俊 } 143*1f4877a4S曾俊 kobj_type(&self) -> Option<&'static dyn KObjType>144*1f4877a4S曾俊 fn kobj_type(&self) -> Option<&'static dyn KObjType> { 145*1f4877a4S曾俊 self.kobj_data.read().kobj_type 146*1f4877a4S曾俊 } 147*1f4877a4S曾俊 set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)148*1f4877a4S曾俊 fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 149*1f4877a4S曾俊 self.kobj_data.write().kobj_type = ktype; 150*1f4877a4S曾俊 } 151*1f4877a4S曾俊 name(&self) -> String152*1f4877a4S曾俊 fn name(&self) -> String { 153*1f4877a4S曾俊 "PciTestDriver".to_string() 154*1f4877a4S曾俊 } 155*1f4877a4S曾俊 set_name(&self, _name: String)156*1f4877a4S曾俊 fn set_name(&self, _name: String) { 157*1f4877a4S曾俊 // do nothing 158*1f4877a4S曾俊 } 159*1f4877a4S曾俊 kobj_state(&self) -> RwLockReadGuard<KObjectState>160*1f4877a4S曾俊 fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 161*1f4877a4S曾俊 self.kobj_state.read() 162*1f4877a4S曾俊 } 163*1f4877a4S曾俊 kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>164*1f4877a4S曾俊 fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 165*1f4877a4S曾俊 self.kobj_state.write() 166*1f4877a4S曾俊 } 167*1f4877a4S曾俊 set_kobj_state(&self, state: KObjectState)168*1f4877a4S曾俊 fn set_kobj_state(&self, state: KObjectState) { 169*1f4877a4S曾俊 *self.kobj_state.write() = state; 170*1f4877a4S曾俊 } 171*1f4877a4S曾俊 } 172