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