subsys.rs 5.9 KB

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