device.rs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. use alloc::{
  2. string::{String, ToString},
  3. sync::{Arc, Weak},
  4. };
  5. use system_error::SystemError;
  6. use crate::{
  7. driver::base::{
  8. device::{
  9. bus::Bus, device_manager, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable,
  10. },
  11. kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
  12. kset::KSet,
  13. },
  14. filesystem::kernfs::KernFSInode,
  15. libs::{
  16. rwlock::{RwLock, RwLockWriteGuard},
  17. spinlock::{SpinLock, SpinLockGuard},
  18. },
  19. };
  20. use super::{
  21. dev_id::PciDeviceID,
  22. pci_irq::IrqType,
  23. subsys::{pci_bus, pci_bus_device},
  24. };
  25. /// # 结构功能
  26. /// 该结构为Pci设备的管理器,使用该结构可以将pci设备添加到sysfs中
  27. pub struct PciDeviceManager;
  28. pub fn pci_device_manager() -> &'static PciDeviceManager {
  29. &PciDeviceManager
  30. }
  31. impl PciDeviceManager {
  32. /// #函数的功能
  33. /// 将pci设备注册到sysfs中
  34. ///
  35. /// ## 参数:
  36. /// - 'pci_dev':需要添加的pci设备
  37. ///
  38. /// ## 返回值:
  39. /// - OK(()) :表示成功
  40. /// - Err(e) :失败原因
  41. pub fn device_add(&self, pci_dev: Arc<dyn PciDevice>) -> Result<(), SystemError> {
  42. // pci设备一般放置在/sys/device/pci:xxxx下
  43. if pci_dev.dev_parent().is_none() {
  44. pci_dev.set_dev_parent(Some(Arc::downgrade(&(pci_bus_device() as Arc<dyn Device>))));
  45. }
  46. // 设置设备的总线
  47. pci_dev.set_bus(Some(Arc::downgrade(&(pci_bus() as Arc<dyn Bus>))));
  48. // 对设备进行默认的初始化
  49. device_manager().device_default_initialize(&(pci_dev.clone() as Arc<dyn Device>));
  50. // 使用设备管理器注册设备,当设备被注册后,会根据它的总线字段,在对应的总线上扫描驱动,并尝试进行匹配
  51. let r = device_manager().add_device(pci_dev.clone() as Arc<dyn Device>);
  52. if r.is_ok() {
  53. //todo:这里可能还要处理一些设置成功后设备状态的变化
  54. return Ok(());
  55. } else {
  56. //todo:这里可能有一些添加失败的处理
  57. return r;
  58. }
  59. }
  60. }
  61. /// #trait功能
  62. /// 要进入sysfs的Pci设备应当实现的trait
  63. pub trait PciDevice: Device {
  64. /// # 函数的功能
  65. /// 返回本设备的PciDeviceID,该ID用于driver和device之间的匹配
  66. ///
  67. /// ## 返回值
  68. /// - 'PciDeviceID' :本设备的PciDeviceID
  69. fn dynid(&self) -> PciDeviceID;
  70. /// # 函数的功能
  71. /// 返回本设备的供应商(vendor)ID
  72. ///
  73. /// ## 返回值
  74. /// - u16 :表示供应商ID
  75. fn vendor(&self) -> u16;
  76. fn device_id(&self) -> u16;
  77. fn subsystem_vendor(&self) -> u16;
  78. fn subsystem_device(&self) -> u16;
  79. fn revision(&self) -> u8;
  80. fn class_code(&self) -> u8;
  81. fn irq_type(&self) -> &RwLock<IrqType>;
  82. fn irq_line(&self) -> u8;
  83. fn subclass(&self) -> u8;
  84. fn interface_code(&self) -> u8;
  85. }
  86. /// #结构功能
  87. /// 由于Pci总线本身就属于一个设备,故该结构代表Pci总线(控制器)本身
  88. /// 它对应/sys/device/pci
  89. #[derive(Debug)]
  90. #[cast_to([sync] Device)]
  91. pub struct PciBusDevice {
  92. inner: SpinLock<InnerPciBusDevice>,
  93. kobj_state: LockedKObjectState,
  94. name: String,
  95. }
  96. impl PciBusDevice {
  97. pub fn new(parent: Option<Weak<dyn KObject>>) -> Arc<Self> {
  98. let bus_device = Self {
  99. inner: SpinLock::new(InnerPciBusDevice {
  100. kobject_common: KObjectCommonData::default(),
  101. device_common: DeviceCommonData::default(),
  102. }),
  103. kobj_state: LockedKObjectState::new(None),
  104. name: "pci".to_string(),
  105. };
  106. bus_device.set_parent(parent);
  107. return Arc::new(bus_device);
  108. }
  109. fn inner(&self) -> SpinLockGuard<'_, InnerPciBusDevice> {
  110. self.inner.lock()
  111. }
  112. }
  113. #[derive(Debug)]
  114. struct InnerPciBusDevice {
  115. kobject_common: KObjectCommonData,
  116. device_common: DeviceCommonData,
  117. }
  118. impl KObject for PciBusDevice {
  119. fn as_any_ref(&self) -> &dyn core::any::Any {
  120. self
  121. }
  122. fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
  123. self.inner().kobject_common.parent.clone()
  124. }
  125. fn inode(&self) -> Option<Arc<KernFSInode>> {
  126. self.inner().kobject_common.kern_inode.clone()
  127. }
  128. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  129. self.inner().kobject_common.kern_inode = inode;
  130. }
  131. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  132. self.inner().kobject_common.kobj_type
  133. }
  134. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  135. self.inner().kobject_common.kobj_type = ktype
  136. }
  137. fn kset(&self) -> Option<Arc<KSet>> {
  138. self.inner().kobject_common.kset.clone()
  139. }
  140. fn kobj_state(
  141. &self,
  142. ) -> crate::libs::rwlock::RwLockReadGuard<'_, crate::driver::base::kobject::KObjectState> {
  143. self.kobj_state.read()
  144. }
  145. fn kobj_state_mut(&self) -> RwLockWriteGuard<'_, KObjectState> {
  146. self.kobj_state.write()
  147. }
  148. fn set_kobj_state(&self, state: KObjectState) {
  149. *self.kobj_state.write() = state;
  150. }
  151. fn name(&self) -> String {
  152. self.name.clone()
  153. }
  154. fn set_name(&self, _name: String) {
  155. //do nothing; it's not supposed to change this struct's name
  156. }
  157. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  158. self.inner().kobject_common.kset = kset;
  159. }
  160. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  161. self.inner().kobject_common.parent = parent;
  162. }
  163. }
  164. impl Device for PciBusDevice {
  165. fn dev_type(&self) -> DeviceType {
  166. return DeviceType::Bus;
  167. }
  168. fn id_table(&self) -> IdTable {
  169. IdTable::new("pci".to_string(), None)
  170. }
  171. fn bus(&self) -> Option<Weak<dyn Bus>> {
  172. self.inner().device_common.bus.clone()
  173. }
  174. fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn Bus>>) {
  175. self.inner().device_common.bus = bus
  176. }
  177. fn driver(&self) -> Option<Arc<dyn Driver>> {
  178. self.inner().device_common.driver.clone()?.upgrade()
  179. }
  180. fn is_dead(&self) -> bool {
  181. false
  182. }
  183. fn set_driver(&self, driver: Option<alloc::sync::Weak<dyn Driver>>) {
  184. self.inner().device_common.driver = driver;
  185. }
  186. fn can_match(&self) -> bool {
  187. todo!()
  188. }
  189. fn set_can_match(&self, _can_match: bool) {
  190. todo!()
  191. }
  192. fn set_class(&self, _class: Option<alloc::sync::Weak<dyn crate::driver::base::class::Class>>) {
  193. todo!()
  194. }
  195. fn state_synced(&self) -> bool {
  196. todo!()
  197. }
  198. fn dev_parent(&self) -> Option<alloc::sync::Weak<dyn Device>> {
  199. self.inner().device_common.get_parent_weak_or_clear()
  200. }
  201. fn set_dev_parent(&self, dev_parent: Option<alloc::sync::Weak<dyn Device>>) {
  202. self.inner().device_common.parent = dev_parent;
  203. }
  204. }