subsys.rs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. use core::{
  2. fmt::Debug,
  3. sync::atomic::{AtomicBool, Ordering},
  4. };
  5. use alloc::{
  6. string::String,
  7. sync::{Arc, Weak},
  8. vec::Vec,
  9. };
  10. use crate::{
  11. libs::{
  12. notifier::AtomicNotifierChain,
  13. rwlock::{RwLock, RwLockReadGuard},
  14. spinlock::SpinLock,
  15. },
  16. syscall::SystemError,
  17. };
  18. use super::{
  19. class::Class,
  20. device::{
  21. bus::{Bus, BusNotifyEvent},
  22. driver::Driver,
  23. Device,
  24. },
  25. kset::KSet,
  26. };
  27. /// 一个用于存储bus/class的驱动核心部分的信息的结构体
  28. #[derive(Debug)]
  29. pub struct SubSysPrivate {
  30. /// 用于定义这个子系统的kset
  31. subsys: Arc<KSet>,
  32. ksets: RwLock<SubSysKSets>,
  33. /// 指向拥有当前结构体的`dyn bus`对象的弱引用
  34. bus: SpinLock<Option<Weak<dyn Bus>>>,
  35. /// 指向拥有当前结构体的`dyn class`对象的弱引用
  36. class: SpinLock<Option<Weak<dyn Class>>>,
  37. drivers_autoprobe: AtomicBool,
  38. /// 当前总线上的所有设备
  39. devices: RwLock<Vec<Weak<dyn Device>>>,
  40. /// 当前总线上的所有驱动
  41. drivers: RwLock<Vec<Weak<dyn Driver>>>,
  42. interfaces: &'static [&'static dyn SubSysInterface],
  43. bus_notifier: AtomicNotifierChain<BusNotifyEvent, Arc<dyn Device>>,
  44. }
  45. #[derive(Debug)]
  46. struct SubSysKSets {
  47. /// 子系统的`devices`目录
  48. devices_kset: Option<Arc<KSet>>,
  49. /// 子系统的`drivers`目录
  50. drivers_kset: Option<Arc<KSet>>,
  51. }
  52. impl SubSysKSets {
  53. pub fn new() -> Self {
  54. return Self {
  55. devices_kset: None,
  56. drivers_kset: None,
  57. };
  58. }
  59. }
  60. impl SubSysPrivate {
  61. pub fn new(
  62. name: String,
  63. bus: Option<Weak<dyn Bus>>,
  64. class: Option<Weak<dyn Class>>,
  65. interfaces: &'static [&'static dyn SubSysInterface],
  66. ) -> Self {
  67. let subsys = KSet::new(name);
  68. return Self {
  69. subsys,
  70. ksets: RwLock::new(SubSysKSets::new()),
  71. drivers_autoprobe: AtomicBool::new(false),
  72. bus: SpinLock::new(bus),
  73. class: SpinLock::new(class),
  74. devices: RwLock::new(Vec::new()),
  75. drivers: RwLock::new(Vec::new()),
  76. interfaces,
  77. bus_notifier: AtomicNotifierChain::new(),
  78. };
  79. }
  80. pub fn subsys(&self) -> Arc<KSet> {
  81. return self.subsys.clone();
  82. }
  83. #[inline]
  84. #[allow(dead_code)]
  85. pub fn bus(&self) -> Option<Weak<dyn Bus>> {
  86. return self.bus.lock().clone();
  87. }
  88. pub fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  89. *self.bus.lock() = bus;
  90. }
  91. #[allow(dead_code)]
  92. #[inline]
  93. pub fn class(&self) -> Option<Weak<dyn Class>> {
  94. return self.class.lock().clone();
  95. }
  96. pub fn set_class(&self, class: Option<Weak<dyn Class>>) {
  97. *self.class.lock() = class;
  98. }
  99. pub fn devices(&self) -> RwLockReadGuard<Vec<Weak<dyn Device>>> {
  100. return self.devices.read();
  101. }
  102. pub fn drivers(&self) -> RwLockReadGuard<Vec<Weak<dyn Driver>>> {
  103. return self.drivers.read();
  104. }
  105. pub fn drivers_autoprobe(&self) -> bool {
  106. return self.drivers_autoprobe.load(Ordering::SeqCst);
  107. }
  108. pub fn set_drivers_autoprobe(&self, drivers_autoprobe: bool) {
  109. self.drivers_autoprobe
  110. .store(drivers_autoprobe, Ordering::SeqCst);
  111. }
  112. #[allow(dead_code)]
  113. #[inline]
  114. pub fn devices_kset(&self) -> Option<Arc<KSet>> {
  115. return self.ksets.read().devices_kset.clone();
  116. }
  117. #[allow(dead_code)]
  118. #[inline]
  119. pub fn set_devices_kset(&self, devices_kset: Arc<KSet>) {
  120. self.ksets.write().devices_kset = Some(devices_kset);
  121. }
  122. #[allow(dead_code)]
  123. #[inline]
  124. pub fn drivers_kset(&self) -> Option<Arc<KSet>> {
  125. return self.ksets.read().drivers_kset.clone();
  126. }
  127. pub fn set_drivers_kset(&self, drivers_kset: Arc<KSet>) {
  128. self.ksets.write().drivers_kset = Some(drivers_kset);
  129. }
  130. pub fn bus_notifier(&self) -> &AtomicNotifierChain<BusNotifyEvent, Arc<dyn Device>> {
  131. return &self.bus_notifier;
  132. }
  133. pub fn interfaces(&self) -> &'static [&'static dyn SubSysInterface] {
  134. return self.interfaces;
  135. }
  136. pub fn add_driver_to_vec(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> {
  137. let mut drivers = self.drivers.write();
  138. let driver_weak = Arc::downgrade(driver);
  139. if drivers.iter().any(|d| d.ptr_eq(&driver_weak)) {
  140. return Err(SystemError::EEXIST);
  141. }
  142. drivers.push(driver_weak);
  143. return Ok(());
  144. }
  145. pub fn remove_driver_from_vec(&self, driver: &Arc<dyn Driver>) {
  146. let mut drivers = self.drivers.write();
  147. let driver_weak = Arc::downgrade(driver);
  148. let index = drivers.iter().position(|d| d.ptr_eq(&driver_weak));
  149. if let Some(index) = index {
  150. drivers.remove(index);
  151. }
  152. }
  153. pub fn add_device_to_vec(&self, device: &Arc<dyn Device>) -> Result<(), SystemError> {
  154. let mut devices = self.devices.write();
  155. let device_weak = Arc::downgrade(device);
  156. if devices.iter().any(|d| d.ptr_eq(&device_weak)) {
  157. return Err(SystemError::EEXIST);
  158. }
  159. devices.push(device_weak);
  160. return Ok(());
  161. }
  162. #[allow(dead_code)]
  163. pub fn remove_device_from_vec(&self, device: &Arc<dyn Device>) {
  164. let mut devices = self.devices.write();
  165. let device_weak = Arc::downgrade(device);
  166. let index = devices.iter().position(|d| d.ptr_eq(&device_weak));
  167. if let Some(index) = index {
  168. devices.remove(index);
  169. }
  170. }
  171. }
  172. /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/include/linux/device.h#63
  173. pub trait SubSysInterface: Debug + Send + Sync {
  174. fn name(&self) -> &str;
  175. fn bus(&self) -> Option<Weak<dyn Bus>>;
  176. fn set_bus(&self, bus: Option<Weak<dyn Bus>>);
  177. fn add_device(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
  178. return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
  179. }
  180. fn remove_device(&self, device: &Arc<dyn Device>);
  181. }