bus.rs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. use super::{
  2. driver::{Driver, DriverMatchName, DriverMatcher},
  3. sys_devices_kset, Device, DeviceMatchName, DeviceMatcher, DeviceState,
  4. };
  5. use crate::{
  6. driver::base::{
  7. device::{device_manager, driver::driver_manager},
  8. kobject::{KObjType, KObject, KObjectManager},
  9. kset::KSet,
  10. subsys::SubSysPrivate,
  11. },
  12. filesystem::{
  13. sysfs::{
  14. file::sysfs_emit_str, sysfs_instance, Attribute, AttributeGroup, SysFSOps,
  15. SysFSOpsSupport, SYSFS_ATTR_MODE_RW, SYSFS_ATTR_MODE_WO,
  16. },
  17. vfs::syscall::ModeType,
  18. },
  19. libs::rwlock::RwLock,
  20. };
  21. use alloc::{
  22. string::{String, ToString},
  23. sync::{Arc, Weak},
  24. };
  25. use core::{ffi::CStr, fmt::Debug, intrinsics::unlikely};
  26. use hashbrown::HashMap;
  27. use intertrait::cast::CastArc;
  28. use log::{debug, error, info};
  29. use system_error::SystemError;
  30. /// `/sys/bus`的kset
  31. static mut BUS_KSET_INSTANCE: Option<Arc<KSet>> = None;
  32. /// `/sys/devices/system`的kset
  33. static mut DEVICES_SYSTEM_KSET_INSTANCE: Option<Arc<KSet>> = None;
  34. static mut BUS_MANAGER_INSTANCE: Option<BusManager> = None;
  35. #[inline(always)]
  36. pub fn sys_bus_kset() -> Arc<KSet> {
  37. unsafe { BUS_KSET_INSTANCE.clone().unwrap() }
  38. }
  39. #[inline(always)]
  40. #[allow(dead_code)]
  41. pub fn sys_devices_system_kset() -> Arc<KSet> {
  42. unsafe { DEVICES_SYSTEM_KSET_INSTANCE.clone().unwrap() }
  43. }
  44. #[inline(always)]
  45. pub fn bus_manager() -> &'static BusManager {
  46. unsafe { BUS_MANAGER_INSTANCE.as_ref().unwrap() }
  47. }
  48. #[inline(always)]
  49. pub fn subsystem_manager() -> &'static SubSystemManager {
  50. &SubSystemManager
  51. }
  52. /// @brief: 总线状态
  53. #[derive(Debug, Copy, Clone)]
  54. pub enum BusState {
  55. NotInitialized = 0, // 未初始化
  56. Initialized = 1, // 已初始化
  57. UnDefined = 2, // 未定义的
  58. }
  59. /// @brief: 将u32类型转换为总线状态类型
  60. impl From<u32> for BusState {
  61. fn from(state: u32) -> Self {
  62. match state {
  63. 0 => BusState::NotInitialized,
  64. 1 => BusState::Initialized,
  65. _ => BusState::UnDefined,
  66. }
  67. }
  68. }
  69. /// @brief: 将总线状态类型转换为u32类型
  70. impl From<DeviceState> for BusState {
  71. fn from(state: DeviceState) -> Self {
  72. match state {
  73. DeviceState::Initialized => BusState::Initialized,
  74. DeviceState::NotInitialized => BusState::NotInitialized,
  75. DeviceState::UnDefined => BusState::UnDefined,
  76. }
  77. }
  78. }
  79. /// @brief: 将总线状态类型转换为设备状态类型
  80. impl From<BusState> for DeviceState {
  81. fn from(state: BusState) -> Self {
  82. match state {
  83. BusState::Initialized => DeviceState::Initialized,
  84. BusState::NotInitialized => DeviceState::NotInitialized,
  85. BusState::UnDefined => DeviceState::UnDefined,
  86. }
  87. }
  88. }
  89. /// 总线子系统的trait,所有总线都应实现该trait
  90. ///
  91. /// 请注意,这个trait是用于实现总线子系统的,而不是总线驱动/总线设备。
  92. /// https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/device/bus.h#84
  93. pub trait Bus: Debug + Send + Sync {
  94. fn name(&self) -> String;
  95. /// Used for subsystems to enumerate devices like ("foo%u", dev->id).
  96. fn dev_name(&self) -> String;
  97. fn root_device(&self) -> Option<Weak<dyn Device>> {
  98. None
  99. }
  100. fn set_root_device(&self, _dev: Option<Weak<dyn Device>>) {}
  101. /// 总线上的设备的默认属性组
  102. fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] {
  103. &[]
  104. }
  105. /// 总线的默认属性组
  106. fn bus_groups(&self) -> &'static [&'static dyn AttributeGroup] {
  107. &[]
  108. }
  109. /// 总线上的驱动的默认属性组
  110. fn drv_groups(&self) -> &'static [&'static dyn AttributeGroup] {
  111. &[]
  112. }
  113. /// 检查设备是否可以被总线绑定,如果可以,就绑定它们。
  114. /// 绑定之后,device的driver字段会被设置为驱动实例。
  115. ///
  116. /// ## 参数
  117. ///
  118. /// - `device` - 设备实例
  119. ///
  120. /// ## 默认实现
  121. ///
  122. /// 如果总线不支持该操作,返回`SystemError::ENOSYS`
  123. fn probe(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
  124. return Err(SystemError::ENOSYS);
  125. }
  126. fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>;
  127. fn sync_state(&self, _device: &Arc<dyn Device>) {}
  128. fn shutdown(&self, _device: &Arc<dyn Device>);
  129. fn suspend(&self, _device: &Arc<dyn Device>) {
  130. // todo: implement suspend
  131. }
  132. fn resume(&self, device: &Arc<dyn Device>) -> Result<(), SystemError>;
  133. /// match device to driver.
  134. ///
  135. /// ## 参数
  136. ///
  137. /// * `device` - device
  138. /// * `driver` - driver
  139. ///
  140. /// ## 返回
  141. ///
  142. /// - `Ok(true)` - 匹配成功
  143. /// - `Ok(false)` - 匹配失败
  144. /// - `Err(_)` - 由于内部错误导致匹配失败
  145. /// - `Err(SystemError::ENOSYS)` - 该总线不支持该操作
  146. fn match_device(
  147. &self,
  148. _device: &Arc<dyn Device>,
  149. _driver: &Arc<dyn Driver>,
  150. ) -> Result<bool, SystemError> {
  151. return Err(SystemError::ENOSYS);
  152. }
  153. fn subsystem(&self) -> &SubSysPrivate;
  154. /// 对当前总线操作的时候需要获取父级总线的锁
  155. fn need_parent_lock(&self) -> bool {
  156. false
  157. }
  158. }
  159. impl dyn Bus {
  160. /// 在bus上,根据条件寻找一个特定的设备
  161. ///
  162. /// ## 参数
  163. ///
  164. /// - `matcher` - 匹配器
  165. /// - `data` - 传给匹配器的数据
  166. pub fn find_device<T: Copy>(
  167. &self,
  168. matcher: &dyn DeviceMatcher<T>,
  169. data: T,
  170. ) -> Option<Arc<dyn Device>> {
  171. let subsys = self.subsystem();
  172. let guard = subsys.devices();
  173. for dev in guard.iter() {
  174. if matcher.match_device(dev, data) {
  175. return Some(dev.clone());
  176. }
  177. }
  178. return None;
  179. }
  180. /// 根据名称匹配设备
  181. ///
  182. /// ## 参数
  183. ///
  184. /// - name 设备名称
  185. pub fn find_device_by_name(&self, name: &str) -> Option<Arc<dyn Device>> {
  186. return self.find_device(&DeviceMatchName, name);
  187. }
  188. /// 在bus上,根据条件寻找一个特定的驱动
  189. ///
  190. /// ## 参数
  191. ///
  192. /// - `matcher` - 匹配器
  193. /// - `data` - 传给匹配器的数据
  194. pub fn find_driver<T: Copy>(
  195. &self,
  196. matcher: &dyn DriverMatcher<T>,
  197. data: T,
  198. ) -> Option<Arc<dyn Driver>> {
  199. let subsys = self.subsystem();
  200. let guard = subsys.drivers();
  201. for drv in guard.iter() {
  202. if matcher.match_driver(drv, data) {
  203. return Some(drv.clone());
  204. }
  205. }
  206. return None;
  207. }
  208. /// 根据名称在bus上匹配驱动
  209. pub fn find_driver_by_name(&self, name: &str) -> Option<Arc<dyn Driver>> {
  210. return self.find_driver(&DriverMatchName, name);
  211. }
  212. }
  213. /// @brief: 总线管理结构体
  214. #[derive(Debug)]
  215. pub struct BusManager {
  216. /// 存储总线bus的kset结构体与bus实例的映射(用于在sysfs callback的时候,根据kset找到bus实例)
  217. kset_bus_map: RwLock<HashMap<Arc<KSet>, Arc<dyn Bus>>>,
  218. }
  219. impl BusManager {
  220. pub fn new() -> Self {
  221. return Self {
  222. kset_bus_map: RwLock::new(HashMap::new()),
  223. };
  224. }
  225. /// 把一个设备添加到总线上
  226. ///
  227. /// ## 描述
  228. ///
  229. /// - 添加一个设备的与bus相关的属性
  230. /// - 在bus和设备文件夹下,创建软链接
  231. /// - 把设备添加到它的总线的设备列表中
  232. ///
  233. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_device#441
  234. ///
  235. /// ## 参数
  236. ///
  237. /// - `dev` - 要被添加的设备
  238. pub fn add_device(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> {
  239. let bus = dev.bus().and_then(|bus| bus.upgrade());
  240. if let Some(bus) = bus {
  241. device_manager().add_groups(dev, bus.dev_groups())?;
  242. // 增加符号链接
  243. let bus_devices_kset = bus
  244. .subsystem()
  245. .devices_kset()
  246. .expect("bus devices kset is none, maybe bus is not registered");
  247. let dev_kobj = dev.clone() as Arc<dyn KObject>;
  248. sysfs_instance().create_link(
  249. Some(&bus_devices_kset.as_kobject()),
  250. &dev_kobj,
  251. dev.name(),
  252. )?;
  253. sysfs_instance().create_link(
  254. Some(&dev_kobj),
  255. &bus.subsystem().subsys().as_kobject(),
  256. "subsystem".to_string(),
  257. )?;
  258. bus.subsystem().add_device_to_vec(dev)?;
  259. }
  260. return Ok(());
  261. }
  262. /// 在总线上添加一个驱动
  263. ///
  264. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_driver#590
  265. pub fn add_driver(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> {
  266. let bus = driver
  267. .bus()
  268. .and_then(|bus| bus.upgrade())
  269. .ok_or(SystemError::EINVAL)?;
  270. debug!("bus '{}' add driver '{}'", bus.name(), driver.name());
  271. driver.set_kobj_type(Some(&BusDriverKType));
  272. let kobj = driver.clone() as Arc<dyn KObject>;
  273. KObjectManager::add_kobj(kobj, bus.subsystem().drivers_kset())?;
  274. bus.subsystem().add_driver_to_vec(driver)?;
  275. if bus.subsystem().drivers_autoprobe() {
  276. let r = driver_manager().driver_attach(driver);
  277. if let Err(e) = r {
  278. bus.subsystem().remove_driver_from_vec(driver);
  279. return Err(e);
  280. }
  281. }
  282. driver_manager()
  283. .add_groups(driver, bus.drv_groups())
  284. .map_err(|e| {
  285. error!(
  286. "BusManager::add_driver: driver '{:?}' add_groups failed, err: '{:?}",
  287. driver.name(),
  288. e
  289. );
  290. e
  291. })
  292. .ok();
  293. if !driver.suppress_bind_attrs() {
  294. self.add_bind_files(driver)
  295. .map_err(|e| {
  296. error!(
  297. "BusManager::add_driver: driver '{:?}' add_bind_files failed, err: '{:?}",
  298. driver.name(),
  299. e
  300. );
  301. e
  302. })
  303. .ok();
  304. }
  305. return Ok(());
  306. }
  307. ///
  308. /// bus_register - register a driver-core subsystem
  309. ///
  310. /// ## 参数
  311. /// - `bus` - bus to register
  312. ///
  313. /// Once we have that, we register the bus with the kobject
  314. /// infrastructure, then register the children subsystems it has:
  315. /// the devices and drivers that belong to the subsystem.
  316. ///
  317. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_register#783
  318. ///
  319. /// todo: 增加错误处理逻辑
  320. pub fn register(&self, bus: Arc<dyn Bus>) -> Result<(), SystemError> {
  321. bus.subsystem().set_bus(Some(Arc::downgrade(&bus)));
  322. let subsys_kset = bus.subsystem().subsys();
  323. subsys_kset.set_name(bus.name());
  324. bus.subsystem().set_drivers_autoprobe(true);
  325. subsys_kset.register(Some(sys_bus_kset()))?;
  326. let devices_kset =
  327. KSet::new_and_add("devices".to_string(), None, Some(subsys_kset.clone()))?;
  328. bus.subsystem().set_devices_kset(devices_kset);
  329. let drivers_kset =
  330. KSet::new_and_add("drivers".to_string(), None, Some(subsys_kset.clone()))?;
  331. bus.subsystem().set_drivers_kset(drivers_kset);
  332. self.add_probe_files(&bus)?;
  333. let bus_groups = bus.bus_groups();
  334. self.add_groups(&bus, bus_groups)?;
  335. // 把bus实例添加到总线管理器中(方便在sysfs callback的时候,根据kset找到bus实例)
  336. self.kset_bus_map.write().insert(subsys_kset, bus.clone());
  337. return Ok(());
  338. }
  339. pub fn unregister(&self, _bus: Arc<dyn Bus>) -> Result<(), SystemError> {
  340. todo!("bus_unregister")
  341. }
  342. fn add_probe_files(&self, bus: &Arc<dyn Bus>) -> Result<(), SystemError> {
  343. self.create_file(bus, &BusAttrDriversProbe)?;
  344. let r = self.create_file(bus, &BusAttrDriversAutoprobe);
  345. if r.is_err() {
  346. self.remove_file(bus, &BusAttrDriversProbe);
  347. }
  348. return r;
  349. }
  350. #[allow(dead_code)]
  351. fn remove_probe_files(&self, bus: &Arc<dyn Bus>) {
  352. self.remove_file(bus, &BusAttrDriversAutoprobe);
  353. self.remove_file(bus, &BusAttrDriversProbe);
  354. }
  355. fn create_file(
  356. &self,
  357. bus: &Arc<dyn Bus>,
  358. attr: &'static dyn Attribute,
  359. ) -> Result<(), SystemError> {
  360. let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>;
  361. return sysfs_instance().create_file(&bus_kobj, attr);
  362. }
  363. fn remove_file(&self, bus: &Arc<dyn Bus>, attr: &'static dyn Attribute) {
  364. let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>;
  365. sysfs_instance().remove_file(&bus_kobj, attr);
  366. }
  367. #[inline]
  368. fn add_groups(
  369. &self,
  370. bus: &Arc<dyn Bus>,
  371. groups: &[&'static dyn AttributeGroup],
  372. ) -> Result<(), SystemError> {
  373. let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>;
  374. return sysfs_instance().create_groups(&bus_kobj, groups);
  375. }
  376. /// 根据bus的kset找到bus实例
  377. fn get_bus_by_kset(&self, kset: &Arc<KSet>) -> Option<Arc<dyn Bus>> {
  378. return self.kset_bus_map.read().get(kset).cloned();
  379. }
  380. /// 为bus上的设备选择可能的驱动程序
  381. ///
  382. /// 这个函数会扫描总线上的所有没有驱动的设备,然后为它们选择可能的驱动程序。
  383. ///
  384. /// ## 参数
  385. ///
  386. /// - `bus` - bus实例
  387. #[allow(dead_code)]
  388. pub fn rescan_devices(&self, bus: &Arc<dyn Bus>) -> Result<(), SystemError> {
  389. for dev in bus.subsystem().devices().iter() {
  390. rescan_devices_helper(dev)?;
  391. }
  392. return Ok(());
  393. }
  394. /// 为新设备探测驱动
  395. ///
  396. /// Automatically probe for a driver if the bus allows it.
  397. pub fn probe_device(&self, dev: &Arc<dyn Device>) {
  398. let bus = dev.bus().and_then(|bus| bus.upgrade());
  399. if bus.is_none() {
  400. return;
  401. }
  402. let bus = bus.unwrap();
  403. if bus.subsystem().drivers_autoprobe() {
  404. device_manager().device_initial_probe(dev).ok();
  405. }
  406. for interface in bus.subsystem().interfaces() {
  407. interface.add_device(dev).ok();
  408. }
  409. }
  410. /// 从总线上移除一个驱动
  411. ///
  412. /// Detach the driver from the devices it controls, and remove
  413. /// it from its bus's list of drivers. Finally, we drop the reference
  414. /// to the bus.
  415. ///
  416. /// ## 参数
  417. ///
  418. /// - `driver` - 驱动实例
  419. ///
  420. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_remove_driver#666
  421. pub fn remove_driver(&self, _driver: &Arc<dyn Driver>) {
  422. todo!("BusManager::remove_driver")
  423. }
  424. fn add_bind_files(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> {
  425. driver_manager().create_attr_file(driver, &DriverAttrUnbind)?;
  426. driver_manager()
  427. .create_attr_file(driver, &DriverAttrBind)
  428. .map_err(|e| {
  429. driver_manager().remove_attr_file(driver, &DriverAttrUnbind);
  430. e
  431. })?;
  432. return Ok(());
  433. }
  434. }
  435. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#684
  436. fn rescan_devices_helper(dev: &Arc<dyn Device>) -> Result<(), SystemError> {
  437. if dev.driver().is_none() {
  438. let need_parent_lock = dev
  439. .bus()
  440. .map(|bus| bus.upgrade().unwrap().need_parent_lock())
  441. .unwrap_or(false);
  442. if unlikely(need_parent_lock) {
  443. // todo: lock device parent
  444. unimplemented!()
  445. }
  446. device_manager().device_attach(dev)?;
  447. }
  448. return Ok(());
  449. }
  450. ///
  451. /// bus_register - register a driver-core subsystem
  452. ///
  453. /// ## 参数
  454. /// - `bus` - bus to register
  455. ///
  456. /// Once we have that, we register the bus with the kobject
  457. /// infrastructure, then register the children subsystems it has:
  458. /// the devices and drivers that belong to the subsystem.
  459. pub fn bus_register(bus: Arc<dyn Bus>) -> Result<(), SystemError> {
  460. return bus_manager().register(bus);
  461. }
  462. /// @brief: 总线注销,并在sys/bus和sys/devices下删除文件夹
  463. /// @parameter bus: Bus设备实体
  464. /// @return: 成功:() 失败:SystemError
  465. #[allow(dead_code)]
  466. pub fn bus_unregister(bus: Arc<dyn Bus>) -> Result<(), SystemError> {
  467. return bus_manager().unregister(bus);
  468. }
  469. pub fn buses_init() -> Result<(), SystemError> {
  470. let bus_kset = KSet::new("bus".to_string());
  471. bus_kset.register(None).expect("bus kset register failed");
  472. unsafe {
  473. BUS_KSET_INSTANCE = Some(bus_kset);
  474. }
  475. // 初始化 /sys/devices/system
  476. {
  477. let devices_system_kset = KSet::new("system".to_string());
  478. let parent = sys_devices_kset() as Arc<dyn KObject>;
  479. devices_system_kset.set_parent(Some(Arc::downgrade(&parent)));
  480. devices_system_kset
  481. .register(Some(sys_devices_kset()))
  482. .expect("devices system kset register failed");
  483. unsafe {
  484. DEVICES_SYSTEM_KSET_INSTANCE = Some(devices_system_kset);
  485. }
  486. }
  487. // 初始化总线管理器
  488. {
  489. let bus_manager = BusManager::new();
  490. unsafe {
  491. BUS_MANAGER_INSTANCE = Some(bus_manager);
  492. }
  493. }
  494. return Ok(());
  495. }
  496. /// 把一个设备添加到总线上
  497. ///
  498. /// ## 描述
  499. ///
  500. /// - 添加一个设备的与bus相关的属性
  501. /// - 在bus和设备文件夹下,创建软链接
  502. /// - 把设备添加到它的总线的设备列表中
  503. ///
  504. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_device#441
  505. ///
  506. /// ## 参数
  507. ///
  508. /// - `dev` - 要被添加的设备
  509. pub fn bus_add_device(dev: &Arc<dyn Device>) -> Result<(), SystemError> {
  510. return bus_manager().add_device(dev);
  511. }
  512. /// 自动为设备在总线上寻找可用的驱动程序
  513. ///
  514. /// Automatically probe for a driver if the bus allows it.
  515. ///
  516. /// ## 参数
  517. ///
  518. /// - `dev` - 要被添加的设备
  519. ///
  520. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_probe_device#478
  521. pub fn bus_probe_device(dev: &Arc<dyn Device>) {
  522. info!("bus_probe_device: dev: {:?}", dev.name());
  523. bus_manager().probe_device(dev);
  524. }
  525. #[derive(Debug)]
  526. struct BusAttrDriversProbe;
  527. impl Attribute for BusAttrDriversProbe {
  528. fn mode(&self) -> ModeType {
  529. return ModeType::S_IWUSR;
  530. }
  531. fn name(&self) -> &str {
  532. return "drivers_probe";
  533. }
  534. fn support(&self) -> SysFSOpsSupport {
  535. return SysFSOpsSupport::ATTR_STORE;
  536. }
  537. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#241
  538. fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> {
  539. let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?;
  540. let bus = bus_manager()
  541. .get_bus_by_kset(&kset)
  542. .ok_or(SystemError::EINVAL)?;
  543. let name = CStr::from_bytes_with_nul(buf)
  544. .map_err(|_| SystemError::EINVAL)?
  545. .to_str()
  546. .map_err(|_| SystemError::EINVAL)?;
  547. let device = bus.find_device_by_name(name).ok_or(SystemError::ENODEV)?;
  548. if rescan_devices_helper(&device).is_ok() {
  549. return Ok(buf.len());
  550. }
  551. return Err(SystemError::EINVAL);
  552. }
  553. }
  554. #[derive(Debug)]
  555. struct BusAttrDriversAutoprobe;
  556. impl Attribute for BusAttrDriversAutoprobe {
  557. fn mode(&self) -> ModeType {
  558. SYSFS_ATTR_MODE_RW
  559. }
  560. fn name(&self) -> &str {
  561. return "drivers_autoprobe";
  562. }
  563. fn support(&self) -> SysFSOpsSupport {
  564. return SysFSOpsSupport::ATTR_STORE | SysFSOpsSupport::ATTR_SHOW;
  565. }
  566. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#231
  567. fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> {
  568. if buf.is_empty() {
  569. return Ok(0);
  570. }
  571. let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?;
  572. let bus = bus_manager()
  573. .get_bus_by_kset(&kset)
  574. .ok_or(SystemError::EINVAL)?;
  575. if buf[0] == b'0' {
  576. bus.subsystem().set_drivers_autoprobe(false);
  577. } else {
  578. bus.subsystem().set_drivers_autoprobe(true);
  579. }
  580. return Ok(buf.len());
  581. }
  582. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#226
  583. fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
  584. let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?;
  585. let bus = bus_manager()
  586. .get_bus_by_kset(&kset)
  587. .ok_or(SystemError::EINVAL)?;
  588. let val = if bus.subsystem().drivers_autoprobe() {
  589. 1
  590. } else {
  591. 0
  592. };
  593. return sysfs_emit_str(buf, format!("{val}\n").as_str());
  594. }
  595. }
  596. #[allow(dead_code)]
  597. #[derive(Debug, Clone, Copy)]
  598. pub enum BusNotifyEvent {
  599. /// 一个设备被添加到总线上
  600. AddDevice,
  601. /// 一个设备将要被移除
  602. DelDevice,
  603. /// 一个设备已经被移除
  604. RemovedDevice,
  605. /// 一个驱动将要被绑定
  606. BindDriver,
  607. /// 一个驱动已经被绑定
  608. BoundDriver,
  609. /// 一个驱动将要被解绑
  610. UnbindDriver,
  611. /// 一个驱动已经被解绑
  612. UnboundDriver,
  613. /// 驱动绑定失败
  614. DriverNotBound,
  615. }
  616. #[derive(Debug)]
  617. struct BusDriverKType;
  618. impl KObjType for BusDriverKType {
  619. fn sysfs_ops(&self) -> Option<&dyn SysFSOps> {
  620. Some(&BusDriverSysFSOps)
  621. }
  622. fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
  623. None
  624. }
  625. }
  626. #[derive(Debug)]
  627. struct BusDriverSysFSOps;
  628. impl SysFSOps for BusDriverSysFSOps {
  629. #[inline]
  630. fn show(
  631. &self,
  632. kobj: Arc<dyn KObject>,
  633. attr: &dyn Attribute,
  634. buf: &mut [u8],
  635. ) -> Result<usize, SystemError> {
  636. attr.show(kobj, buf)
  637. }
  638. #[inline]
  639. fn store(
  640. &self,
  641. kobj: Arc<dyn KObject>,
  642. attr: &dyn Attribute,
  643. buf: &[u8],
  644. ) -> Result<usize, SystemError> {
  645. attr.store(kobj, buf)
  646. }
  647. }
  648. #[derive(Debug)]
  649. struct DriverAttrUnbind;
  650. impl Attribute for DriverAttrUnbind {
  651. fn mode(&self) -> ModeType {
  652. SYSFS_ATTR_MODE_WO
  653. }
  654. fn name(&self) -> &str {
  655. "unbind"
  656. }
  657. fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> {
  658. let driver = kobj.cast::<dyn Driver>().map_err(|kobj| {
  659. error!(
  660. "Intertrait casting not implemented for kobj: {}",
  661. kobj.name()
  662. );
  663. SystemError::ENOSYS
  664. })?;
  665. let bus = driver
  666. .bus()
  667. .and_then(|bus| bus.upgrade())
  668. .ok_or(SystemError::ENODEV)?;
  669. let s = CStr::from_bytes_with_nul(buf)
  670. .map_err(|_| SystemError::EINVAL)?
  671. .to_str()
  672. .map_err(|_| SystemError::EINVAL)?;
  673. let dev = bus.find_device_by_name(s).ok_or(SystemError::ENODEV)?;
  674. let p = dev.driver().ok_or(SystemError::ENODEV)?;
  675. if Arc::ptr_eq(&p, &driver) {
  676. device_manager().device_driver_detach(&dev);
  677. return Ok(buf.len());
  678. }
  679. return Err(SystemError::ENODEV);
  680. }
  681. fn support(&self) -> SysFSOpsSupport {
  682. SysFSOpsSupport::ATTR_STORE
  683. }
  684. }
  685. #[derive(Debug)]
  686. struct DriverAttrBind;
  687. impl Attribute for DriverAttrBind {
  688. fn name(&self) -> &str {
  689. "bind"
  690. }
  691. fn mode(&self) -> ModeType {
  692. SYSFS_ATTR_MODE_WO
  693. }
  694. /*
  695. * Manually attach a device to a driver.
  696. * Note: the driver must want to bind to the device,
  697. * it is not possible to override the driver's id table.
  698. */
  699. fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> {
  700. let driver = kobj.cast::<dyn Driver>().map_err(|kobj| {
  701. error!(
  702. "Intertrait casting not implemented for kobj: {}",
  703. kobj.name()
  704. );
  705. SystemError::ENOSYS
  706. })?;
  707. let bus = driver
  708. .bus()
  709. .and_then(|bus| bus.upgrade())
  710. .ok_or(SystemError::ENODEV)?;
  711. let device = bus
  712. .find_device_by_name(
  713. CStr::from_bytes_with_nul(buf)
  714. .map_err(|_| SystemError::EINVAL)?
  715. .to_str()
  716. .map_err(|_| SystemError::EINVAL)?,
  717. )
  718. .ok_or(SystemError::ENODEV)?;
  719. if driver_manager().match_device(&driver, &device)? {
  720. device_manager().device_driver_attach(&driver, &device)?;
  721. return Ok(buf.len());
  722. }
  723. return Err(SystemError::ENODEV);
  724. }
  725. fn support(&self) -> SysFSOpsSupport {
  726. SysFSOpsSupport::ATTR_STORE
  727. }
  728. }
  729. #[derive(Debug)]
  730. pub struct SubSystemManager;
  731. impl SubSystemManager {
  732. /// 注册一个子系统,并在`/sys/bus`和指定的父级文件夹下创建子文件夹
  733. ///
  734. /// ## 参数
  735. ///
  736. /// - `subsys` - 子系统实例
  737. /// - `fake_root_dev` - 该子系统的伪根设备
  738. /// - `parent_of_root` - 该子系统的伪根设备的父级节点
  739. ///
  740. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=subsys_system_register#1078
  741. pub fn subsys_register(
  742. &self,
  743. subsys: &Arc<dyn Bus>,
  744. fake_root_dev: &Arc<dyn Device>,
  745. parent_of_root: &Arc<dyn KObject>,
  746. ) -> Result<(), SystemError> {
  747. bus_manager().register(subsys.clone())?;
  748. fake_root_dev.set_name(subsys.name());
  749. fake_root_dev.set_parent(Some(Arc::downgrade(parent_of_root)));
  750. device_manager().register(fake_root_dev.clone())?;
  751. subsys.set_root_device(Some(Arc::downgrade(fake_root_dev)));
  752. return Ok(());
  753. }
  754. /// register a subsystem at /sys/devices/system/
  755. /// 并且在/sys/bus和/sys/devices下创建文件夹
  756. ///
  757. /// All 'system' subsystems have a /sys/devices/system/<name> root device
  758. /// with the name of the subsystem. The root device can carry subsystem-
  759. /// wide attributes. All registered devices are below this single root
  760. /// device and are named after the subsystem with a simple enumeration
  761. /// number appended. The registered devices are not explicitly named;
  762. /// only 'id' in the device needs to be set.
  763. pub fn subsys_system_register(
  764. &self,
  765. subsys: &Arc<dyn Bus>,
  766. fake_root_dev: &Arc<dyn Device>,
  767. ) -> Result<(), SystemError> {
  768. return self.subsys_register(
  769. subsys,
  770. fake_root_dev,
  771. &(sys_devices_system_kset() as Arc<dyn KObject>),
  772. );
  773. }
  774. }