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