xref: /DragonOS/kernel/src/driver/pci/device.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
11f4877a4S曾俊 use alloc::{
21f4877a4S曾俊     string::{String, ToString},
31f4877a4S曾俊     sync::{Arc, Weak},
41f4877a4S曾俊 };
51f4877a4S曾俊 use system_error::SystemError;
61f4877a4S曾俊 
71f4877a4S曾俊 use crate::{
81f4877a4S曾俊     driver::base::{
91f4877a4S曾俊         device::{
101f4877a4S曾俊             bus::Bus, device_manager, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable,
111f4877a4S曾俊         },
121f4877a4S曾俊         kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
131f4877a4S曾俊         kset::KSet,
141f4877a4S曾俊     },
151f4877a4S曾俊     filesystem::kernfs::KernFSInode,
16*28fe4ad2S黄铭涛     libs::{
17*28fe4ad2S黄铭涛         rwlock::RwLockWriteGuard,
18*28fe4ad2S黄铭涛         spinlock::{SpinLock, SpinLockGuard},
19*28fe4ad2S黄铭涛     },
201f4877a4S曾俊 };
211f4877a4S曾俊 
221f4877a4S曾俊 use super::{
231f4877a4S曾俊     dev_id::PciDeviceID,
241f4877a4S曾俊     subsys::{pci_bus, pci_bus_device},
251f4877a4S曾俊 };
261f4877a4S曾俊 
271f4877a4S曾俊 /// # 结构功能
281f4877a4S曾俊 /// 该结构为Pci设备的管理器,使用该结构可以将pci设备添加到sysfs中
291f4877a4S曾俊 pub struct PciDeviceManager;
301f4877a4S曾俊 
pci_device_manager() -> &'static PciDeviceManager311f4877a4S曾俊 pub fn pci_device_manager() -> &'static PciDeviceManager {
321f4877a4S曾俊     &PciDeviceManager
331f4877a4S曾俊 }
341f4877a4S曾俊 
351f4877a4S曾俊 impl PciDeviceManager {
361f4877a4S曾俊     /// #函数的功能
371f4877a4S曾俊     /// 将pci设备注册到sysfs中
381f4877a4S曾俊     ///
391f4877a4S曾俊     /// ## 参数:
401f4877a4S曾俊     /// - 'pci_dev':需要添加的pci设备
411f4877a4S曾俊     ///
421f4877a4S曾俊     /// ## 返回值:
431f4877a4S曾俊     /// - OK(()) :表示成功
441f4877a4S曾俊     /// - Err(e) :失败原因
device_add(&self, pci_dev: Arc<dyn PciDevice>) -> Result<(), SystemError>451f4877a4S曾俊     pub fn device_add(&self, pci_dev: Arc<dyn PciDevice>) -> Result<(), SystemError> {
461f4877a4S曾俊         // pci设备一般放置在/sys/device/pci:xxxx下
47*28fe4ad2S黄铭涛         if pci_dev.dev_parent().is_none() {
48*28fe4ad2S黄铭涛             pci_dev.set_dev_parent(Some(Arc::downgrade(&(pci_bus_device() as Arc<dyn Device>))));
491f4877a4S曾俊         }
501f4877a4S曾俊         // 设置设备的总线
511f4877a4S曾俊         pci_dev.set_bus(Some(Arc::downgrade(&(pci_bus() as Arc<dyn Bus>))));
521f4877a4S曾俊         // 对设备进行默认的初始化
531f4877a4S曾俊         device_manager().device_default_initialize(&(pci_dev.clone() as Arc<dyn Device>));
541f4877a4S曾俊         // 使用设备管理器注册设备,当设备被注册后,会根据它的总线字段,在对应的总线上扫描驱动,并尝试进行匹配
551f4877a4S曾俊         let r = device_manager().add_device(pci_dev.clone() as Arc<dyn Device>);
561f4877a4S曾俊 
571f4877a4S曾俊         if r.is_ok() {
581f4877a4S曾俊             //todo:这里可能还要处理一些设置成功后设备状态的变化
591f4877a4S曾俊             return Ok(());
601f4877a4S曾俊         } else {
611f4877a4S曾俊             //todo:这里可能有一些添加失败的处理
621f4877a4S曾俊             return r;
631f4877a4S曾俊         }
641f4877a4S曾俊     }
651f4877a4S曾俊 }
661f4877a4S曾俊 
671f4877a4S曾俊 /// #trait功能
681f4877a4S曾俊 /// 要进入sysfs的Pci设备应当实现的trait
691f4877a4S曾俊 pub trait PciDevice: Device {
701f4877a4S曾俊     /// # 函数的功能
711f4877a4S曾俊     /// 返回本设备的PciDeviceID,该ID用于driver和device之间的匹配
721f4877a4S曾俊     ///
731f4877a4S曾俊     /// ## 返回值
741f4877a4S曾俊     /// - 'PciDeviceID' :本设备的PciDeviceID
dynid(&self) -> PciDeviceID751f4877a4S曾俊     fn dynid(&self) -> PciDeviceID;
761f4877a4S曾俊 
771f4877a4S曾俊     /// # 函数的功能
781f4877a4S曾俊     /// 返回本设备的供应商(vendor)ID
791f4877a4S曾俊     ///
801f4877a4S曾俊     /// ## 返回值
811f4877a4S曾俊     /// - u16 :表示供应商ID
vendor(&self) -> u16821f4877a4S曾俊     fn vendor(&self) -> u16;
device_id(&self) -> u16831f4877a4S曾俊     fn device_id(&self) -> u16;
subsystem_vendor(&self) -> u16841f4877a4S曾俊     fn subsystem_vendor(&self) -> u16;
subsystem_device(&self) -> u16851f4877a4S曾俊     fn subsystem_device(&self) -> u16;
861f4877a4S曾俊 }
871f4877a4S曾俊 
881f4877a4S曾俊 /// #结构功能
891f4877a4S曾俊 /// 由于Pci总线本身就属于一个设备,故该结构代表Pci总线(控制器)本身
901f4877a4S曾俊 /// 它对应/sys/device/pci
911f4877a4S曾俊 #[derive(Debug)]
921f4877a4S曾俊 #[cast_to([sync] Device)]
931f4877a4S曾俊 pub struct PciBusDevice {
94*28fe4ad2S黄铭涛     inner: SpinLock<InnerPciBusDevice>,
951f4877a4S曾俊     kobj_state: LockedKObjectState,
961f4877a4S曾俊     name: String,
971f4877a4S曾俊 }
981f4877a4S曾俊 
991f4877a4S曾俊 impl PciBusDevice {
new(parent: Option<Weak<dyn KObject>>) -> Arc<Self>1001f4877a4S曾俊     pub fn new(parent: Option<Weak<dyn KObject>>) -> Arc<Self> {
1011f4877a4S曾俊         let bus_device = Self {
102*28fe4ad2S黄铭涛             inner: SpinLock::new(InnerPciBusDevice {
103*28fe4ad2S黄铭涛                 kobject_common: KObjectCommonData::default(),
104*28fe4ad2S黄铭涛                 device_common: DeviceCommonData::default(),
105*28fe4ad2S黄铭涛             }),
1061f4877a4S曾俊             kobj_state: LockedKObjectState::new(None),
1071f4877a4S曾俊             name: "pci".to_string(),
1081f4877a4S曾俊         };
1091f4877a4S曾俊         bus_device.set_parent(parent);
1101f4877a4S曾俊         return Arc::new(bus_device);
1111f4877a4S曾俊     }
112*28fe4ad2S黄铭涛 
inner(&self) -> SpinLockGuard<InnerPciBusDevice>113*28fe4ad2S黄铭涛     fn inner(&self) -> SpinLockGuard<InnerPciBusDevice> {
114*28fe4ad2S黄铭涛         self.inner.lock()
115*28fe4ad2S黄铭涛     }
116*28fe4ad2S黄铭涛 }
117*28fe4ad2S黄铭涛 
118*28fe4ad2S黄铭涛 #[derive(Debug)]
119*28fe4ad2S黄铭涛 struct InnerPciBusDevice {
120*28fe4ad2S黄铭涛     kobject_common: KObjectCommonData,
121*28fe4ad2S黄铭涛     device_common: DeviceCommonData,
1221f4877a4S曾俊 }
1231f4877a4S曾俊 
1241f4877a4S曾俊 impl KObject for PciBusDevice {
as_any_ref(&self) -> &dyn core::any::Any1251f4877a4S曾俊     fn as_any_ref(&self) -> &dyn core::any::Any {
1261f4877a4S曾俊         self
1271f4877a4S曾俊     }
1281f4877a4S曾俊 
parent(&self) -> Option<alloc::sync::Weak<dyn KObject>>1291f4877a4S曾俊     fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
130*28fe4ad2S黄铭涛         self.inner().kobject_common.parent.clone()
1311f4877a4S曾俊     }
1321f4877a4S曾俊 
inode(&self) -> Option<Arc<KernFSInode>>1331f4877a4S曾俊     fn inode(&self) -> Option<Arc<KernFSInode>> {
134*28fe4ad2S黄铭涛         self.inner().kobject_common.kern_inode.clone()
1351f4877a4S曾俊     }
1361f4877a4S曾俊 
set_inode(&self, inode: Option<Arc<KernFSInode>>)1371f4877a4S曾俊     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
138*28fe4ad2S黄铭涛         self.inner().kobject_common.kern_inode = inode;
1391f4877a4S曾俊     }
1401f4877a4S曾俊 
kobj_type(&self) -> Option<&'static dyn KObjType>1411f4877a4S曾俊     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
142*28fe4ad2S黄铭涛         self.inner().kobject_common.kobj_type
1431f4877a4S曾俊     }
1441f4877a4S曾俊 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)1451f4877a4S曾俊     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
146*28fe4ad2S黄铭涛         self.inner().kobject_common.kobj_type = ktype
1471f4877a4S曾俊     }
1481f4877a4S曾俊 
kset(&self) -> Option<Arc<KSet>>1491f4877a4S曾俊     fn kset(&self) -> Option<Arc<KSet>> {
150*28fe4ad2S黄铭涛         self.inner().kobject_common.kset.clone()
1511f4877a4S曾俊     }
1521f4877a4S曾俊 
kobj_state( &self, ) -> crate::libs::rwlock::RwLockReadGuard<crate::driver::base::kobject::KObjectState>1531f4877a4S曾俊     fn kobj_state(
1541f4877a4S曾俊         &self,
1551f4877a4S曾俊     ) -> crate::libs::rwlock::RwLockReadGuard<crate::driver::base::kobject::KObjectState> {
1561f4877a4S曾俊         self.kobj_state.read()
1571f4877a4S曾俊     }
1581f4877a4S曾俊 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>1591f4877a4S曾俊     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
1601f4877a4S曾俊         self.kobj_state.write()
1611f4877a4S曾俊     }
1621f4877a4S曾俊 
set_kobj_state(&self, state: KObjectState)1631f4877a4S曾俊     fn set_kobj_state(&self, state: KObjectState) {
1641f4877a4S曾俊         *self.kobj_state.write() = state;
1651f4877a4S曾俊     }
1661f4877a4S曾俊 
name(&self) -> String1671f4877a4S曾俊     fn name(&self) -> String {
1681f4877a4S曾俊         self.name.clone()
1691f4877a4S曾俊     }
1701f4877a4S曾俊 
set_name(&self, _name: String)1711f4877a4S曾俊     fn set_name(&self, _name: String) {
1721f4877a4S曾俊         //do nothing; it's not supposed to change this struct's name
1731f4877a4S曾俊     }
1741f4877a4S曾俊 
set_kset(&self, kset: Option<Arc<KSet>>)1751f4877a4S曾俊     fn set_kset(&self, kset: Option<Arc<KSet>>) {
176*28fe4ad2S黄铭涛         self.inner().kobject_common.kset = kset;
1771f4877a4S曾俊     }
1781f4877a4S曾俊 
set_parent(&self, parent: Option<Weak<dyn KObject>>)1791f4877a4S曾俊     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
180*28fe4ad2S黄铭涛         self.inner().kobject_common.parent = parent;
1811f4877a4S曾俊     }
1821f4877a4S曾俊 }
1831f4877a4S曾俊 
1841f4877a4S曾俊 impl Device for PciBusDevice {
dev_type(&self) -> DeviceType1851f4877a4S曾俊     fn dev_type(&self) -> DeviceType {
1861f4877a4S曾俊         return DeviceType::Bus;
1871f4877a4S曾俊     }
1881f4877a4S曾俊 
id_table(&self) -> IdTable1891f4877a4S曾俊     fn id_table(&self) -> IdTable {
1901f4877a4S曾俊         IdTable::new("pci".to_string(), None)
1911f4877a4S曾俊     }
1921f4877a4S曾俊 
bus(&self) -> Option<Weak<dyn Bus>>1931f4877a4S曾俊     fn bus(&self) -> Option<Weak<dyn Bus>> {
194*28fe4ad2S黄铭涛         self.inner().device_common.bus.clone()
1951f4877a4S曾俊     }
1961f4877a4S曾俊 
set_bus(&self, bus: Option<alloc::sync::Weak<dyn Bus>>)1971f4877a4S曾俊     fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn Bus>>) {
198*28fe4ad2S黄铭涛         self.inner().device_common.bus = bus
1991f4877a4S曾俊     }
2001f4877a4S曾俊 
driver(&self) -> Option<Arc<dyn Driver>>2011f4877a4S曾俊     fn driver(&self) -> Option<Arc<dyn Driver>> {
202*28fe4ad2S黄铭涛         self.inner().device_common.driver.clone()?.upgrade()
2031f4877a4S曾俊     }
2041f4877a4S曾俊 
is_dead(&self) -> bool2051f4877a4S曾俊     fn is_dead(&self) -> bool {
2061f4877a4S曾俊         false
2071f4877a4S曾俊     }
2081f4877a4S曾俊 
set_driver(&self, driver: Option<alloc::sync::Weak<dyn Driver>>)2091f4877a4S曾俊     fn set_driver(&self, driver: Option<alloc::sync::Weak<dyn Driver>>) {
210*28fe4ad2S黄铭涛         self.inner().device_common.driver = driver;
2111f4877a4S曾俊     }
2121f4877a4S曾俊 
can_match(&self) -> bool2131f4877a4S曾俊     fn can_match(&self) -> bool {
2141f4877a4S曾俊         todo!()
2151f4877a4S曾俊     }
2161f4877a4S曾俊 
set_can_match(&self, _can_match: bool)2171f4877a4S曾俊     fn set_can_match(&self, _can_match: bool) {
2181f4877a4S曾俊         todo!()
2191f4877a4S曾俊     }
2201f4877a4S曾俊 
set_class(&self, _class: Option<alloc::sync::Weak<dyn crate::driver::base::class::Class>>)2211f4877a4S曾俊     fn set_class(&self, _class: Option<alloc::sync::Weak<dyn crate::driver::base::class::Class>>) {
2221f4877a4S曾俊         todo!()
2231f4877a4S曾俊     }
2241f4877a4S曾俊 
state_synced(&self) -> bool2251f4877a4S曾俊     fn state_synced(&self) -> bool {
2261f4877a4S曾俊         todo!()
2271f4877a4S曾俊     }
228*28fe4ad2S黄铭涛 
dev_parent(&self) -> Option<alloc::sync::Weak<dyn Device>>229*28fe4ad2S黄铭涛     fn dev_parent(&self) -> Option<alloc::sync::Weak<dyn Device>> {
230*28fe4ad2S黄铭涛         self.inner().device_common.get_parent_weak_or_clear()
231*28fe4ad2S黄铭涛     }
232*28fe4ad2S黄铭涛 
set_dev_parent(&self, dev_parent: Option<alloc::sync::Weak<dyn Device>>)233*28fe4ad2S黄铭涛     fn set_dev_parent(&self, dev_parent: Option<alloc::sync::Weak<dyn Device>>) {
234*28fe4ad2S黄铭涛         self.inner().device_common.parent = dev_parent;
235*28fe4ad2S黄铭涛     }
2361f4877a4S曾俊 }
237