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