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