xref: /DragonOS/kernel/src/driver/pci/test/pt_driver.rs (revision 1f4877a4c512eb5ad232436128a0c52287b39aaa)
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