pt_driver.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. use alloc::{
  2. string::{String, ToString},
  3. sync::{Arc, Weak},
  4. vec::Vec,
  5. };
  6. use crate::{
  7. driver::{
  8. base::{
  9. device::{
  10. bus::Bus,
  11. driver::{Driver, DriverCommonData},
  12. Device, IdTable,
  13. },
  14. kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
  15. kset::KSet,
  16. },
  17. pci::{dev_id::PciDeviceID, device::PciDevice, driver::PciDriver},
  18. },
  19. filesystem::kernfs::KernFSInode,
  20. libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
  21. };
  22. #[derive(Debug)]
  23. #[cast_to([sync] PciDriver)]
  24. pub struct TestDriver {
  25. driver_data: RwLock<DriverCommonData>,
  26. kobj_data: RwLock<KObjectCommonData>,
  27. kobj_state: LockedKObjectState,
  28. pub locked_dynid_list: RwLock<Vec<Arc<PciDeviceID>>>,
  29. }
  30. /// # 结构功能
  31. /// 本结构体是测试用的驱动,目前暂时保留,否则将出现大量dead code
  32. /// 在编写了实际的pci驱动后,可将该驱动删除
  33. impl TestDriver {
  34. pub fn new() -> Self {
  35. Self {
  36. driver_data: RwLock::new(DriverCommonData::default()),
  37. kobj_data: RwLock::new(KObjectCommonData::default()),
  38. kobj_state: LockedKObjectState::new(None),
  39. locked_dynid_list: RwLock::new(vec![]),
  40. }
  41. }
  42. }
  43. impl PciDriver for TestDriver {
  44. fn add_dynid(&mut self, id: PciDeviceID) -> Result<(), system_error::SystemError> {
  45. let id = Arc::new(id);
  46. self.locked_dynid_list.write().push(id);
  47. Ok(())
  48. }
  49. fn locked_dynid_list(&self) -> Option<Vec<Arc<PciDeviceID>>> {
  50. Some(self.locked_dynid_list.read().clone())
  51. }
  52. fn probe(
  53. &self,
  54. _device: &Arc<dyn PciDevice>,
  55. _id: &PciDeviceID,
  56. ) -> Result<(), system_error::SystemError> {
  57. Ok(())
  58. }
  59. fn remove(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> {
  60. Ok(())
  61. }
  62. fn resume(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> {
  63. Ok(())
  64. }
  65. fn shutdown(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> {
  66. Ok(())
  67. }
  68. fn suspend(&self, _device: &Arc<dyn PciDevice>) -> Result<(), system_error::SystemError> {
  69. Ok(())
  70. }
  71. }
  72. impl Driver for TestDriver {
  73. fn id_table(&self) -> Option<IdTable> {
  74. Some(IdTable::new("PciTestDriver".to_string(), None))
  75. }
  76. fn devices(&self) -> Vec<Arc<dyn Device>> {
  77. self.driver_data.read().devices.clone()
  78. }
  79. fn add_device(&self, device: Arc<dyn Device>) {
  80. let mut guard = self.driver_data.write();
  81. // check if the device is already in the list
  82. if guard.devices.iter().any(|dev| Arc::ptr_eq(dev, &device)) {
  83. return;
  84. }
  85. guard.devices.push(device);
  86. }
  87. fn delete_device(&self, device: &Arc<dyn Device>) {
  88. let mut guard = self.driver_data.write();
  89. guard.devices.retain(|dev| !Arc::ptr_eq(dev, device));
  90. }
  91. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  92. self.driver_data.write().bus = bus;
  93. }
  94. fn bus(&self) -> Option<Weak<dyn Bus>> {
  95. self.driver_data.read().bus.clone()
  96. }
  97. }
  98. impl KObject for TestDriver {
  99. fn as_any_ref(&self) -> &dyn core::any::Any {
  100. self
  101. }
  102. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  103. self.kobj_data.write().kern_inode = inode;
  104. }
  105. fn inode(&self) -> Option<Arc<KernFSInode>> {
  106. self.kobj_data.read().kern_inode.clone()
  107. }
  108. fn parent(&self) -> Option<Weak<dyn KObject>> {
  109. self.kobj_data.read().parent.clone()
  110. }
  111. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  112. self.kobj_data.write().parent = parent;
  113. }
  114. fn kset(&self) -> Option<Arc<KSet>> {
  115. self.kobj_data.read().kset.clone()
  116. }
  117. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  118. self.kobj_data.write().kset = kset;
  119. }
  120. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  121. self.kobj_data.read().kobj_type
  122. }
  123. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  124. self.kobj_data.write().kobj_type = ktype;
  125. }
  126. fn name(&self) -> String {
  127. "PciTestDriver".to_string()
  128. }
  129. fn set_name(&self, _name: String) {
  130. // do nothing
  131. }
  132. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  133. self.kobj_state.read()
  134. }
  135. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  136. self.kobj_state.write()
  137. }
  138. fn set_kobj_state(&self, state: KObjectState) {
  139. *self.kobj_state.write() = state;
  140. }
  141. }