xref: /DragonOS/kernel/src/driver/pci/raw_device.rs (revision 1f4877a4c512eb5ad232436128a0c52287b39aaa)
1*1f4877a4S曾俊 use core::any::Any;
2*1f4877a4S曾俊 
3*1f4877a4S曾俊 use alloc::{
4*1f4877a4S曾俊     string::{String, ToString},
5*1f4877a4S曾俊     sync::{Arc, Weak},
6*1f4877a4S曾俊 };
7*1f4877a4S曾俊 
8*1f4877a4S曾俊 use crate::{
9*1f4877a4S曾俊     driver::base::{
10*1f4877a4S曾俊         class::Class,
11*1f4877a4S曾俊         device::{bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable},
12*1f4877a4S曾俊         kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
13*1f4877a4S曾俊         kset::KSet,
14*1f4877a4S曾俊     },
15*1f4877a4S曾俊     filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup},
16*1f4877a4S曾俊     libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
17*1f4877a4S曾俊 };
18*1f4877a4S曾俊 
19*1f4877a4S曾俊 use super::{
20*1f4877a4S曾俊     attr::BasicPciReadOnlyAttrs, dev_id::PciDeviceID, device::PciDevice,
21*1f4877a4S曾俊     pci::PciDeviceStructureGeneralDevice,
22*1f4877a4S曾俊 };
23*1f4877a4S曾俊 #[derive(Debug)]
24*1f4877a4S曾俊 #[cast_to([sync] Device)]
25*1f4877a4S曾俊 #[cast_to([sync] PciDevice)]
26*1f4877a4S曾俊 pub struct PciGeneralDevice {
27*1f4877a4S曾俊     device_data: RwLock<DeviceCommonData>,
28*1f4877a4S曾俊     kobj_data: RwLock<KObjectCommonData>,
29*1f4877a4S曾俊     name: RwLock<Option<String>>,
30*1f4877a4S曾俊     kobj_state: LockedKObjectState,
31*1f4877a4S曾俊     dev_id: PciDeviceID,
32*1f4877a4S曾俊     header: Arc<PciDeviceStructureGeneralDevice>,
33*1f4877a4S曾俊 }
34*1f4877a4S曾俊 
35*1f4877a4S曾俊 impl From<&PciDeviceStructureGeneralDevice> for PciGeneralDevice {
36*1f4877a4S曾俊     fn from(value: &PciDeviceStructureGeneralDevice) -> Self {
37*1f4877a4S曾俊         let value = Arc::new(value.clone());
38*1f4877a4S曾俊         let name: String = value.common_header.bus_device_function.into();
39*1f4877a4S曾俊         let kobj_state = LockedKObjectState::new(None);
40*1f4877a4S曾俊         let common_dev = RwLock::new(DeviceCommonData::default());
41*1f4877a4S曾俊         let common_kobj = RwLock::new(KObjectCommonData::default());
42*1f4877a4S曾俊         let dev_id = PciDeviceID::dummpy();
43*1f4877a4S曾俊 
44*1f4877a4S曾俊         // dev_id.set_special(PciSpecifiedData::Virtio());
45*1f4877a4S曾俊         let res = Self {
46*1f4877a4S曾俊             device_data: common_dev,
47*1f4877a4S曾俊             kobj_data: common_kobj,
48*1f4877a4S曾俊             kobj_state,
49*1f4877a4S曾俊             dev_id,
50*1f4877a4S曾俊             header: value,
51*1f4877a4S曾俊             name: RwLock::new(None),
52*1f4877a4S曾俊         };
53*1f4877a4S曾俊         res.set_name(name);
54*1f4877a4S曾俊         res
55*1f4877a4S曾俊     }
56*1f4877a4S曾俊 }
57*1f4877a4S曾俊 
58*1f4877a4S曾俊 impl PciDevice for PciGeneralDevice {
59*1f4877a4S曾俊     fn dynid(&self) -> PciDeviceID {
60*1f4877a4S曾俊         self.dev_id
61*1f4877a4S曾俊     }
62*1f4877a4S曾俊 
63*1f4877a4S曾俊     fn vendor(&self) -> u16 {
64*1f4877a4S曾俊         self.header.common_header.vendor_id
65*1f4877a4S曾俊     }
66*1f4877a4S曾俊 
67*1f4877a4S曾俊     fn device_id(&self) -> u16 {
68*1f4877a4S曾俊         self.header.common_header.device_id
69*1f4877a4S曾俊     }
70*1f4877a4S曾俊 
71*1f4877a4S曾俊     fn subsystem_vendor(&self) -> u16 {
72*1f4877a4S曾俊         self.header.subsystem_vendor_id
73*1f4877a4S曾俊     }
74*1f4877a4S曾俊 
75*1f4877a4S曾俊     fn subsystem_device(&self) -> u16 {
76*1f4877a4S曾俊         self.header.subsystem_id
77*1f4877a4S曾俊     }
78*1f4877a4S曾俊 }
79*1f4877a4S曾俊 
80*1f4877a4S曾俊 impl Device for PciGeneralDevice {
81*1f4877a4S曾俊     fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
82*1f4877a4S曾俊         Some(&[&BasicPciReadOnlyAttrs])
83*1f4877a4S曾俊     }
84*1f4877a4S曾俊 
85*1f4877a4S曾俊     fn bus(&self) -> Option<Weak<dyn Bus>> {
86*1f4877a4S曾俊         self.device_data.read().bus.clone()
87*1f4877a4S曾俊     }
88*1f4877a4S曾俊 
89*1f4877a4S曾俊     fn class(&self) -> Option<Arc<dyn Class>> {
90*1f4877a4S曾俊         let mut guard = self.device_data.write();
91*1f4877a4S曾俊         let r = guard.class.clone()?.upgrade();
92*1f4877a4S曾俊         if r.is_none() {
93*1f4877a4S曾俊             guard.class = None;
94*1f4877a4S曾俊         }
95*1f4877a4S曾俊 
96*1f4877a4S曾俊         return r;
97*1f4877a4S曾俊     }
98*1f4877a4S曾俊 
99*1f4877a4S曾俊     fn driver(&self) -> Option<Arc<dyn Driver>> {
100*1f4877a4S曾俊         self.device_data.read().driver.clone()?.upgrade()
101*1f4877a4S曾俊     }
102*1f4877a4S曾俊 
103*1f4877a4S曾俊     fn dev_type(&self) -> DeviceType {
104*1f4877a4S曾俊         DeviceType::Pci
105*1f4877a4S曾俊     }
106*1f4877a4S曾俊 
107*1f4877a4S曾俊     fn id_table(&self) -> IdTable {
108*1f4877a4S曾俊         IdTable::new("testPci".to_string(), None)
109*1f4877a4S曾俊     }
110*1f4877a4S曾俊 
111*1f4877a4S曾俊     fn can_match(&self) -> bool {
112*1f4877a4S曾俊         true
113*1f4877a4S曾俊     }
114*1f4877a4S曾俊 
115*1f4877a4S曾俊     fn is_dead(&self) -> bool {
116*1f4877a4S曾俊         false
117*1f4877a4S曾俊     }
118*1f4877a4S曾俊 
119*1f4877a4S曾俊     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
120*1f4877a4S曾俊         self.device_data.write().bus = bus;
121*1f4877a4S曾俊     }
122*1f4877a4S曾俊 
123*1f4877a4S曾俊     fn set_can_match(&self, _can_match: bool) {}
124*1f4877a4S曾俊 
125*1f4877a4S曾俊     fn set_class(&self, class: Option<Weak<dyn Class>>) {
126*1f4877a4S曾俊         self.device_data.write().class = class;
127*1f4877a4S曾俊     }
128*1f4877a4S曾俊 
129*1f4877a4S曾俊     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
130*1f4877a4S曾俊         self.device_data.write().driver = driver
131*1f4877a4S曾俊     }
132*1f4877a4S曾俊 
133*1f4877a4S曾俊     fn state_synced(&self) -> bool {
134*1f4877a4S曾俊         true
135*1f4877a4S曾俊     }
136*1f4877a4S曾俊 }
137*1f4877a4S曾俊 
138*1f4877a4S曾俊 impl KObject for PciGeneralDevice {
139*1f4877a4S曾俊     fn as_any_ref(&self) -> &dyn Any {
140*1f4877a4S曾俊         self
141*1f4877a4S曾俊     }
142*1f4877a4S曾俊 
143*1f4877a4S曾俊     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
144*1f4877a4S曾俊         self.kobj_data.write().kern_inode = inode;
145*1f4877a4S曾俊     }
146*1f4877a4S曾俊 
147*1f4877a4S曾俊     fn inode(&self) -> Option<Arc<KernFSInode>> {
148*1f4877a4S曾俊         self.kobj_data.read().kern_inode.clone()
149*1f4877a4S曾俊     }
150*1f4877a4S曾俊 
151*1f4877a4S曾俊     fn parent(&self) -> Option<Weak<dyn KObject>> {
152*1f4877a4S曾俊         self.kobj_data.read().parent.clone()
153*1f4877a4S曾俊     }
154*1f4877a4S曾俊 
155*1f4877a4S曾俊     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
156*1f4877a4S曾俊         self.kobj_data.write().parent = parent;
157*1f4877a4S曾俊     }
158*1f4877a4S曾俊 
159*1f4877a4S曾俊     fn kset(&self) -> Option<Arc<KSet>> {
160*1f4877a4S曾俊         self.kobj_data.read().kset.clone()
161*1f4877a4S曾俊     }
162*1f4877a4S曾俊 
163*1f4877a4S曾俊     fn set_kset(&self, kset: Option<Arc<KSet>>) {
164*1f4877a4S曾俊         self.kobj_data.write().kset = kset;
165*1f4877a4S曾俊     }
166*1f4877a4S曾俊 
167*1f4877a4S曾俊     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
168*1f4877a4S曾俊         self.kobj_data.read().kobj_type
169*1f4877a4S曾俊     }
170*1f4877a4S曾俊 
171*1f4877a4S曾俊     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
172*1f4877a4S曾俊         self.kobj_data.write().kobj_type = ktype;
173*1f4877a4S曾俊     }
174*1f4877a4S曾俊 
175*1f4877a4S曾俊     fn name(&self) -> String {
176*1f4877a4S曾俊         self.name.read().clone().unwrap()
177*1f4877a4S曾俊     }
178*1f4877a4S曾俊 
179*1f4877a4S曾俊     fn set_name(&self, name: String) {
180*1f4877a4S曾俊         *self.name.write() = Some(name);
181*1f4877a4S曾俊     }
182*1f4877a4S曾俊 
183*1f4877a4S曾俊     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
184*1f4877a4S曾俊         self.kobj_state.read()
185*1f4877a4S曾俊     }
186*1f4877a4S曾俊 
187*1f4877a4S曾俊     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
188*1f4877a4S曾俊         self.kobj_state.write()
189*1f4877a4S曾俊     }
190*1f4877a4S曾俊 
191*1f4877a4S曾俊     fn set_kobj_state(&self, state: KObjectState) {
192*1f4877a4S曾俊         *self.kobj_state.write() = state;
193*1f4877a4S曾俊     }
194*1f4877a4S曾俊 }
195