xref: /DragonOS/kernel/src/driver/base/device/mod.rs (revision 338f6903262c5031abad3c8e361813355a27fcdb)
1 use alloc::{
2     string::{String, ToString},
3     sync::{Arc, Weak},
4 };
5 use intertrait::cast::CastArc;
6 
7 use crate::{
8     driver::{
9         acpi::glue::acpi_device_notify,
10         base::map::{LockedDevsMap, LockedKObjMap},
11     },
12     exception::irqdata::IrqHandlerData,
13     filesystem::{
14         sysfs::{
15             file::sysfs_emit_str, sysfs_instance, Attribute, AttributeGroup, SysFSOps,
16             SysFSOpsSupport,
17         },
18         vfs::syscall::ModeType,
19     },
20 };
21 
22 use core::fmt::Debug;
23 use core::intrinsics::unlikely;
24 use system_error::SystemError;
25 
26 use self::{
27     bus::{bus_add_device, bus_probe_device, Bus},
28     device_number::{DeviceNumber, Major},
29     driver::Driver,
30 };
31 
32 use super::{
33     class::Class,
34     kobject::{KObjType, KObject, KObjectManager, KObjectState},
35     kset::KSet,
36     swnode::software_node_notify,
37 };
38 
39 pub mod bus;
40 pub mod dd;
41 pub mod device_number;
42 pub mod driver;
43 pub mod init;
44 
45 static mut DEVICE_MANAGER: Option<DeviceManager> = None;
46 
47 #[inline(always)]
48 pub fn device_manager() -> &'static DeviceManager {
49     unsafe { DEVICE_MANAGER.as_ref().unwrap() }
50 }
51 
52 lazy_static! {
53     // 全局字符设备号管理实例
54     pub static ref CHARDEVS: Arc<LockedDevsMap> = Arc::new(LockedDevsMap::default());
55 
56     // 全局块设备管理实例
57     pub static ref BLOCKDEVS: Arc<LockedDevsMap> = Arc::new(LockedDevsMap::default());
58 
59     // 全局设备管理实例
60     pub static ref DEVMAP: Arc<LockedKObjMap> = Arc::new(LockedKObjMap::default());
61 
62 }
63 
64 /// `/sys/devices` 的 kset 实例
65 static mut DEVICES_KSET_INSTANCE: Option<Arc<KSet>> = None;
66 /// `/sys/dev` 的 kset 实例
67 static mut DEV_KSET_INSTANCE: Option<Arc<KSet>> = None;
68 /// `/sys/dev/block` 的 kset 实例
69 static mut DEV_BLOCK_KSET_INSTANCE: Option<Arc<KSet>> = None;
70 /// `/sys/dev/char` 的 kset 实例
71 static mut DEV_CHAR_KSET_INSTANCE: Option<Arc<KSet>> = None;
72 
73 /// `/sys/devices/virtual` 的 kset 实例
74 static mut DEVICES_VIRTUAL_KSET_INSTANCE: Option<Arc<KSet>> = None;
75 
76 /// 获取`/sys/devices`的kset实例
77 #[inline(always)]
78 pub(super) fn sys_devices_kset() -> Arc<KSet> {
79     unsafe { DEVICES_KSET_INSTANCE.as_ref().unwrap().clone() }
80 }
81 
82 /// 获取`/sys/dev`的kset实例
83 #[inline(always)]
84 pub(super) fn sys_dev_kset() -> Arc<KSet> {
85     unsafe { DEV_KSET_INSTANCE.as_ref().unwrap().clone() }
86 }
87 
88 /// 获取`/sys/dev/block`的kset实例
89 #[inline(always)]
90 #[allow(dead_code)]
91 pub fn sys_dev_block_kset() -> Arc<KSet> {
92     unsafe { DEV_BLOCK_KSET_INSTANCE.as_ref().unwrap().clone() }
93 }
94 
95 /// 获取`/sys/dev/char`的kset实例
96 #[inline(always)]
97 pub fn sys_dev_char_kset() -> Arc<KSet> {
98     unsafe { DEV_CHAR_KSET_INSTANCE.as_ref().unwrap().clone() }
99 }
100 
101 pub(self) unsafe fn set_sys_dev_block_kset(kset: Arc<KSet>) {
102     DEV_BLOCK_KSET_INSTANCE = Some(kset);
103 }
104 
105 pub(self) unsafe fn set_sys_dev_char_kset(kset: Arc<KSet>) {
106     DEV_CHAR_KSET_INSTANCE = Some(kset);
107 }
108 
109 /// 获取`/sys/devices/virtual`的kset实例
110 pub fn sys_devices_virtual_kset() -> Arc<KSet> {
111     unsafe { DEVICES_VIRTUAL_KSET_INSTANCE.as_ref().unwrap().clone() }
112 }
113 
114 pub(self) unsafe fn set_sys_devices_virtual_kset(kset: Arc<KSet>) {
115     DEVICES_VIRTUAL_KSET_INSTANCE = Some(kset);
116 }
117 
118 /// 设备应该实现的操作
119 ///
120 /// ## 注意
121 ///
122 /// 由于设备驱动模型需要从Arc<dyn KObject>转换为Arc<dyn Device>,
123 /// 因此,所有的实现了Device trait的结构体,都应该在结构体上方标注`#[cast_to([sync] Device)]`,
124 ///
125 /// 否则在释放设备资源的时候,会由于无法转换为Arc<dyn Device>而导致资源泄露,并且release回调函数也不会被调用。
126 pub trait Device: KObject {
127     // TODO: 待实现 open, close
128 
129     /// @brief: 获取设备类型
130     /// @parameter: None
131     /// @return: 实现该trait的设备所属类型
132     fn dev_type(&self) -> DeviceType;
133 
134     /// @brief: 获取设备标识
135     /// @parameter: None
136     /// @return: 该设备唯一标识
137     fn id_table(&self) -> IdTable;
138 
139     /// 设备释放时的回调函数
140     fn release(&self) {
141         let name = self.name();
142         kwarn!(
143             "device {} does not have a release() function, it is broken and must be fixed.",
144             name
145         );
146     }
147 
148     /// 获取当前设备所属的总线
149     fn bus(&self) -> Option<Weak<dyn Bus>> {
150         return None;
151     }
152 
153     /// 设置当前设备所属的总线
154     ///
155     /// (一定要传入Arc,因为bus的subsysprivate里面存储的是Device的Arc指针)
156     ///
157     /// 注意,如果实现了当前方法,那么必须实现`bus()`方法
158     fn set_bus(&self, bus: Option<Weak<dyn Bus>>);
159 
160     /// 获取当前设备所属的类
161     fn class(&self) -> Option<Arc<dyn Class>> {
162         return None;
163     }
164 
165     /// 设置当前设备所属的类
166     ///
167     /// 注意,如果实现了当前方法,那么必须实现`class()`方法
168     fn set_class(&self, class: Option<Arc<dyn Class>>);
169 
170     /// 返回已经与当前设备匹配好的驱动程序
171     fn driver(&self) -> Option<Arc<dyn Driver>>;
172 
173     fn set_driver(&self, driver: Option<Weak<dyn Driver>>);
174 
175     /// 当前设备是否已经挂掉了
176     fn is_dead(&self) -> bool;
177 
178     /// 当前设备是否处于可以被匹配的状态
179     ///
180     /// The device has matched with a driver at least once or it is in
181     /// a bus (like AMBA) which can't check for matching drivers until
182     /// other devices probe successfully.
183     fn can_match(&self) -> bool;
184 
185     fn set_can_match(&self, can_match: bool);
186 
187     /// The hardware state of this device has been synced to match
188     /// the software state of this device by calling the driver/bus
189     /// sync_state() callback.
190     fn state_synced(&self) -> bool;
191 
192     fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
193         None
194     }
195 }
196 
197 impl dyn Device {
198     #[inline(always)]
199     pub fn is_registered(&self) -> bool {
200         self.kobj_state().contains(KObjectState::IN_SYSFS)
201     }
202 }
203 
204 // 暂定是不可修改的,在初始化的时候就要确定。以后可能会包括例如硬件中断包含的信息
205 #[allow(dead_code)]
206 #[derive(Debug, Clone)]
207 pub struct DevicePrivateData {
208     id_table: IdTable,
209     state: DeviceState,
210 }
211 
212 #[allow(dead_code)]
213 impl DevicePrivateData {
214     pub fn new(id_table: IdTable, state: DeviceState) -> Self {
215         Self { id_table, state }
216     }
217 
218     pub fn id_table(&self) -> &IdTable {
219         &self.id_table
220     }
221 
222     pub fn state(&self) -> DeviceState {
223         self.state
224     }
225 
226     pub fn set_state(&mut self, state: DeviceState) {
227         self.state = state;
228     }
229 }
230 
231 /// @brief: 设备类型
232 #[allow(dead_code)]
233 #[derive(Debug, Eq, PartialEq)]
234 pub enum DeviceType {
235     Bus,
236     Net,
237     Gpu,
238     Input,
239     Block,
240     Rtc,
241     Serial,
242     Intc,
243     PlatformDev,
244     Char,
245 }
246 
247 /// @brief: 设备标识符类型
248 #[derive(Debug, Clone, Hash, PartialOrd, PartialEq, Ord, Eq)]
249 pub struct IdTable {
250     basename: String,
251     id: Option<DeviceNumber>,
252 }
253 
254 /// @brief: 设备标识符操作方法集
255 impl IdTable {
256     /// @brief: 创建一个新的设备标识符
257     /// @parameter name: 设备名
258     /// @parameter id: 设备id
259     /// @return: 设备标识符
260     pub fn new(basename: String, id: Option<DeviceNumber>) -> IdTable {
261         return IdTable { basename, id };
262     }
263 
264     /// @brief: 将设备标识符转换成name
265     /// @parameter None
266     /// @return: 设备名
267     pub fn name(&self) -> String {
268         if self.id.is_none() {
269             return self.basename.clone();
270         } else {
271             let id = self.id.unwrap();
272             return format!("{}:{}", id.major().data(), id.minor());
273         }
274     }
275 
276     pub fn device_number(&self) -> DeviceNumber {
277         return self.id.unwrap_or(DeviceNumber::default());
278     }
279 }
280 
281 impl Default for IdTable {
282     fn default() -> Self {
283         IdTable::new("unknown".to_string(), None)
284     }
285 }
286 
287 // 以现在的模型,设备在加载到系统中就是已经初始化的状态了,因此可以考虑把这个删掉
288 /// @brief: 设备当前状态
289 #[derive(Debug, Clone, Copy, Eq, PartialEq)]
290 pub enum DeviceState {
291     NotInitialized = 0,
292     Initialized = 1,
293     UnDefined = 2,
294 }
295 
296 /// @brief: 设备错误类型
297 #[allow(dead_code)]
298 #[derive(Debug, Copy, Clone)]
299 pub enum DeviceError {
300     DriverExists,         // 设备已存在
301     DeviceExists,         // 驱动已存在
302     InitializeFailed,     // 初始化错误
303     NotInitialized,       // 未初始化的设备
304     NoDeviceForDriver,    // 没有合适的设备匹配驱动
305     NoDriverForDevice,    // 没有合适的驱动匹配设备
306     RegisterError,        // 注册失败
307     UnsupportedOperation, // 不支持的操作
308 }
309 
310 impl Into<SystemError> for DeviceError {
311     fn into(self) -> SystemError {
312         match self {
313             DeviceError::DriverExists => SystemError::EEXIST,
314             DeviceError::DeviceExists => SystemError::EEXIST,
315             DeviceError::InitializeFailed => SystemError::EIO,
316             DeviceError::NotInitialized => SystemError::ENODEV,
317             DeviceError::NoDeviceForDriver => SystemError::ENODEV,
318             DeviceError::NoDriverForDevice => SystemError::ENODEV,
319             DeviceError::RegisterError => SystemError::EIO,
320             DeviceError::UnsupportedOperation => SystemError::EIO,
321         }
322     }
323 }
324 
325 /// @brief: 将u32类型转换为设备状态类型
326 impl From<u32> for DeviceState {
327     fn from(state: u32) -> Self {
328         match state {
329             0 => DeviceState::NotInitialized,
330             1 => DeviceState::Initialized,
331             _ => todo!(),
332         }
333     }
334 }
335 
336 /// @brief: 将设备状态转换为u32类型
337 impl From<DeviceState> for u32 {
338     fn from(state: DeviceState) -> Self {
339         match state {
340             DeviceState::NotInitialized => 0,
341             DeviceState::Initialized => 1,
342             DeviceState::UnDefined => 2,
343         }
344     }
345 }
346 
347 #[derive(Debug)]
348 pub struct DeviceKObjType;
349 
350 impl KObjType for DeviceKObjType {
351     // https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#2307
352     fn release(&self, kobj: Arc<dyn KObject>) {
353         let dev = kobj.cast::<dyn Device>().unwrap();
354         /*
355          * Some platform devices are driven without driver attached
356          * and managed resources may have been acquired.  Make sure
357          * all resources are released.
358          *
359          * Drivers still can add resources into device after device
360          * is deleted but alive, so release devres here to avoid
361          * possible memory leak.
362          */
363 
364         // todo: 在引入devres之后再实现
365         // devres_release_all(kobj);
366         dev.release();
367     }
368 
369     fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
370         None
371     }
372 
373     fn sysfs_ops(&self) -> Option<&dyn SysFSOps> {
374         Some(&DeviceSysFSOps)
375     }
376 }
377 
378 #[derive(Debug)]
379 pub(super) struct DeviceSysFSOps;
380 
381 impl SysFSOps for DeviceSysFSOps {
382     fn store(
383         &self,
384         kobj: Arc<dyn KObject>,
385         attr: &dyn Attribute,
386         buf: &[u8],
387     ) -> Result<usize, SystemError> {
388         return attr.store(kobj, buf);
389     }
390 
391     fn show(
392         &self,
393         kobj: Arc<dyn KObject>,
394         attr: &dyn Attribute,
395         buf: &mut [u8],
396     ) -> Result<usize, SystemError> {
397         return attr.show(kobj, buf);
398     }
399 }
400 
401 /// @brief Device管理器
402 #[derive(Debug)]
403 pub struct DeviceManager;
404 
405 impl DeviceManager {
406     /// @brief: 创建一个新的设备管理器
407     /// @parameter: None
408     /// @return: DeviceManager实体
409     #[inline]
410     const fn new() -> DeviceManager {
411         return Self;
412     }
413 
414     pub fn register(&self, device: Arc<dyn Device>) -> Result<(), SystemError> {
415         self.device_default_initialize(&device);
416         return self.add_device(device);
417     }
418 
419     /// @brief: 添加设备
420     /// @parameter id_table: 总线标识符,用于唯一标识该总线
421     /// @parameter dev: 设备实例
422     /// @return: None
423     ///
424     /// https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#3398
425     ///
426     /// todo: 完善错误处理逻辑:如果添加失败,需要将之前添加的内容全部回滚
427     #[inline(never)]
428     #[allow(dead_code)]
429     pub fn add_device(&self, device: Arc<dyn Device>) -> Result<(), SystemError> {
430         // 在这里处理与parent相关的逻辑
431 
432         let current_parent = device
433             .parent()
434             .map(|x| x.upgrade())
435             .flatten()
436             .map(|x| x.arc_any().cast::<dyn Device>().ok())
437             .flatten();
438 
439         let actual_parent = self.get_device_parent(&device, current_parent)?;
440         if let Some(actual_parent) = actual_parent {
441             // kdebug!(
442             //     "device '{}' parent is '{}', strong_count: {}",
443             //     device.name().to_string(),
444             //     actual_parent.name(),
445             //     Arc::strong_count(&actual_parent)
446             // );
447             device.set_parent(Some(Arc::downgrade(&actual_parent)));
448         }
449 
450         KObjectManager::add_kobj(device.clone() as Arc<dyn KObject>, None).map_err(|e| {
451             kerror!("add device '{:?}' failed: {:?}", device.name(), e);
452             e
453         })?;
454 
455         self.device_platform_notify(&device);
456 
457         self.add_class_symlinks(&device)?;
458 
459         self.add_attrs(&device)?;
460 
461         bus_add_device(&device)?;
462 
463         if device.id_table().device_number().major() != Major::UNNAMED_MAJOR {
464             self.create_file(&device, &DeviceAttrDev)?;
465 
466             self.create_sys_dev_entry(&device)?;
467         }
468 
469         // 通知客户端有关设备添加的信息。此调用必须在 dpm_sysfs_add() 之后且在 kobject_uevent() 之前执行。
470         if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() {
471             bus.subsystem().bus_notifier().call_chain(
472                 bus::BusNotifyEvent::AddDevice,
473                 Some(&device),
474                 None,
475             );
476         }
477 
478         // todo: 发送uevent: KOBJ_ADD
479 
480         // probe drivers for a new device
481         bus_probe_device(&device);
482 
483         if let Some(class) = device.class() {
484             class.subsystem().add_device_to_vec(&device)?;
485 
486             for class_interface in class.subsystem().interfaces() {
487                 class_interface.add_device(&device).ok();
488             }
489         }
490 
491         return Ok(());
492     }
493 
494     /// 获取设备真实的parent kobject
495     ///
496     /// ## 参数
497     ///
498     /// - `device`: 设备
499     /// - `current_parent`: 当前的parent kobject
500     ///
501     /// ## 返回值
502     ///
503     /// - `Ok(Some(kobj))`: 如果找到了真实的parent kobject,那么返回它
504     /// - `Ok(None)`: 如果没有找到真实的parent kobject,那么返回None
505     /// - `Err(e)`: 如果发生错误,那么返回错误
506     fn get_device_parent(
507         &self,
508         device: &Arc<dyn Device>,
509         current_parent: Option<Arc<dyn Device>>,
510     ) -> Result<Option<Arc<dyn KObject>>, SystemError> {
511         // kdebug!("get_device_parent() device:{:?}", device.name());
512         if let Some(_) = device.class() {
513             let parent_kobj: Arc<dyn KObject>;
514             // kdebug!("current_parent:{:?}", current_parent);
515             if current_parent.is_none() {
516                 parent_kobj = sys_devices_virtual_kset() as Arc<dyn KObject>;
517             } else {
518                 let cp = current_parent.unwrap();
519 
520                 if cp.class().is_some() {
521                     return Ok(Some(cp.clone() as Arc<dyn KObject>));
522                 } else {
523                     parent_kobj = cp.clone() as Arc<dyn KObject>;
524                 }
525             }
526 
527             // 是否需要glue dir?
528 
529             return Ok(Some(parent_kobj));
530         }
531 
532         // subsystems can specify a default root directory for their devices
533         if current_parent.is_none() {
534             if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() {
535                 if let Some(root) = bus.root_device().map(|x| x.upgrade()).flatten() {
536                     return Ok(Some(root as Arc<dyn KObject>));
537                 }
538             }
539         }
540 
541         if current_parent.is_some() {
542             return Ok(Some(current_parent.unwrap().clone() as Arc<dyn KObject>));
543         }
544 
545         return Ok(None);
546     }
547 
548     /// @brief: 卸载设备
549     /// @parameter id_table: 总线标识符,用于唯一标识该设备
550     /// @return: None
551     ///
552     /// ## 注意
553     /// 该函数已废弃,不再使用
554     #[inline]
555     #[allow(dead_code)]
556     pub fn remove_device(&self, _id_table: &IdTable) {
557         todo!()
558     }
559 
560     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#542
561     pub fn remove(&self, _dev: &Arc<dyn Device>) {
562         todo!("DeviceManager::remove")
563     }
564 
565     /// @brief: 获取设备
566     /// @parameter id_table: 设备标识符,用于唯一标识该设备
567     /// @return: 设备实例
568     #[inline]
569     #[allow(dead_code)]
570     pub fn find_device_by_idtable(&self, _id_table: &IdTable) -> Option<Arc<dyn Device>> {
571         todo!("find_device_by_idtable")
572     }
573 
574     fn device_platform_notify(&self, dev: &Arc<dyn Device>) {
575         acpi_device_notify(dev);
576         software_node_notify(dev);
577     }
578 
579     // 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#3224
580     fn add_class_symlinks(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> {
581         let class = dev.class();
582         if class.is_none() {
583             return Ok(());
584         }
585 
586         // 定义错误处理函数,用于在添加符号链接失败时,移除已经添加的符号链接
587 
588         let err_remove_device = |dev_kobj: &Arc<dyn KObject>| {
589             sysfs_instance().remove_link(dev_kobj, "device".to_string());
590         };
591 
592         let err_remove_subsystem = |dev_kobj: &Arc<dyn KObject>| {
593             sysfs_instance().remove_link(dev_kobj, "subsystem".to_string());
594         };
595 
596         let class = class.unwrap();
597         let dev_kobj = dev.clone() as Arc<dyn KObject>;
598         let subsys_kobj = class.subsystem().subsys() as Arc<dyn KObject>;
599         sysfs_instance().create_link(Some(&dev_kobj), &subsys_kobj, "subsystem".to_string())?;
600 
601         // todo: 这里需要处理class的parent逻辑, 添加device链接
602         if let Some(parent) = dev.parent().map(|x| x.upgrade()).flatten() {
603             let parent_kobj = parent.clone() as Arc<dyn KObject>;
604             sysfs_instance()
605                 .create_link(Some(&dev_kobj), &&parent_kobj, "device".to_string())
606                 .map_err(|e| {
607                     err_remove_subsystem(&dev_kobj);
608                     e
609                 })?;
610         }
611 
612         sysfs_instance()
613             .create_link(Some(&subsys_kobj), &dev_kobj, dev.name())
614             .map_err(|e| {
615                 err_remove_device(&dev_kobj);
616                 err_remove_subsystem(&dev_kobj);
617                 e
618             })?;
619 
620         return Ok(());
621     }
622 
623     /// 在sysfs中,为指定的设备创建属性文件
624     ///
625     /// ## 参数
626     ///
627     /// - `dev`: 设备
628     fn add_attrs(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> {
629         // 定义错误处理函数,用于在添加属性文件失败时,移除已经添加的属性组
630         let err_remove_class_groups = |dev: &Arc<dyn Device>| {
631             if let Some(class) = dev.class() {
632                 let attr_groups = class.dev_groups();
633                 self.remove_groups(dev, attr_groups);
634             }
635         };
636 
637         let err_remove_kobj_type_groups = |dev: &Arc<dyn Device>| {
638             if let Some(kobj_type) = dev.kobj_type() {
639                 let attr_groups = kobj_type.attribute_groups().unwrap_or(&[]);
640                 self.remove_groups(dev, attr_groups);
641             }
642         };
643 
644         // 真正开始添加属性文件
645 
646         // 添加设备类的属性文件
647         if let Some(class) = dev.class() {
648             let attr_groups = class.dev_groups();
649             self.add_groups(dev, attr_groups)?;
650         }
651 
652         // 添加kobj_type的属性文件
653         if let Some(kobj_type) = dev.kobj_type() {
654             self.add_groups(dev, kobj_type.attribute_groups().unwrap_or(&[]))
655                 .map_err(|e| {
656                     err_remove_class_groups(dev);
657                     e
658                 })?;
659         }
660 
661         // 添加设备本身的属性文件
662         self.add_groups(dev, dev.attribute_groups().unwrap_or(&[]))
663             .map_err(|e| {
664                 err_remove_kobj_type_groups(dev);
665                 err_remove_class_groups(dev);
666                 e
667             })?;
668 
669         return Ok(());
670     }
671 
672     /// 在sysfs中,为指定的设备创建属性组,以及属性组中的属性文件
673     ///
674     /// ## 参数
675     ///
676     /// - `dev`: 设备
677     /// - `attr_groups`: 属性组
678     pub fn add_groups(
679         &self,
680         dev: &Arc<dyn Device>,
681         attr_groups: &'static [&dyn AttributeGroup],
682     ) -> Result<(), SystemError> {
683         let kobj = dev.clone() as Arc<dyn KObject>;
684         return sysfs_instance().create_groups(&kobj, attr_groups);
685     }
686 
687     /// 在sysfs中,为指定的设备移除属性组,以及属性组中的属性文件
688     ///
689     /// ## 参数
690     ///
691     /// - `dev`: 设备
692     /// - `attr_groups`: 要移除的属性组
693     pub fn remove_groups(
694         &self,
695         dev: &Arc<dyn Device>,
696         attr_groups: &'static [&dyn AttributeGroup],
697     ) {
698         let kobj = dev.clone() as Arc<dyn KObject>;
699         sysfs_instance().remove_groups(&kobj, attr_groups);
700     }
701 
702     /// 为设备在sysfs中创建属性文件
703     ///
704     /// ## 参数
705     ///
706     /// - `dev`: 设备
707     /// - `attr`: 属性
708     pub fn create_file(
709         &self,
710         dev: &Arc<dyn Device>,
711         attr: &'static dyn Attribute,
712     ) -> Result<(), SystemError> {
713         if unlikely(
714             attr.mode().contains(ModeType::S_IRUGO)
715                 && (!attr.support().contains(SysFSOpsSupport::ATTR_SHOW)),
716         ) {
717             kwarn!(
718                 "Attribute '{}': read permission without 'show'",
719                 attr.name()
720             );
721         }
722         if unlikely(
723             attr.mode().contains(ModeType::S_IWUGO)
724                 && (!attr.support().contains(SysFSOpsSupport::ATTR_STORE)),
725         ) {
726             kwarn!(
727                 "Attribute '{}': write permission without 'store'",
728                 attr.name()
729             );
730         }
731 
732         let kobj = dev.clone() as Arc<dyn KObject>;
733 
734         return sysfs_instance().create_file(&kobj, attr);
735     }
736 
737     /// 在/sys/dev下,或者设备所属的class下,为指定的设备创建链接
738     fn create_sys_dev_entry(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> {
739         let target_kobj = self.device_to_dev_kobj(dev);
740         let name = dev.id_table().name();
741         let current_kobj = dev.clone() as Arc<dyn KObject>;
742         return sysfs_instance().create_link(Some(&target_kobj), &current_kobj, name);
743     }
744 
745     /// Delete symlink for device in `/sys/dev` or `/sys/class/<class_name>`
746     #[allow(dead_code)]
747     fn remove_sys_dev_entry(&self, dev: &Arc<dyn Device>) {
748         let kobj = self.device_to_dev_kobj(dev);
749         let name = dev.id_table().name();
750         sysfs_instance().remove_link(&kobj, name);
751     }
752 
753     /// device_to_dev_kobj - select a /sys/dev/ directory for the device
754     ///
755     /// By default we select char/ for new entries.
756     ///
757     /// ## 参数
758     ///
759     /// - `dev`: 设备
760     fn device_to_dev_kobj(&self, _dev: &Arc<dyn Device>) -> Arc<dyn KObject> {
761         // todo: 处理class的逻辑
762         let kobj = sys_dev_char_kset().as_kobject();
763         return kobj;
764     }
765 
766     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c?fi=device_links_force_bind#1226
767     pub fn device_links_force_bind(&self, _dev: &Arc<dyn Device>) {
768         todo!("device_links_force_bind")
769     }
770 
771     /// 把device对象的一些结构进行默认初始化
772     ///
773     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c?fi=device_initialize#2976
774     pub fn device_default_initialize(&self, dev: &Arc<dyn Device>) {
775         dev.set_kset(Some(sys_devices_kset()));
776         dev.set_kobj_type(Some(&DeviceKObjType));
777         return;
778     }
779 
780     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?r=&mo=29885&fi=1100#1100
781     pub fn device_driver_attach(
782         &self,
783         _driver: &Arc<dyn Driver>,
784         _dev: &Arc<dyn Device>,
785     ) -> Result<(), SystemError> {
786         todo!("device_driver_attach")
787     }
788 
789     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?r=&mo=35401&fi=1313#1313
790     pub fn device_driver_detach(&self, _dev: &Arc<dyn Device>) {
791         todo!("device_driver_detach")
792     }
793 }
794 
795 /// @brief: 设备注册
796 /// @parameter: name: 设备名
797 /// @return: 操作成功,返回(),操作失败,返回错误码
798 pub fn device_register<T: Device>(device: Arc<T>) -> Result<(), SystemError> {
799     return device_manager().register(device);
800 }
801 
802 /// @brief: 设备卸载
803 /// @parameter: name: 设备名
804 /// @return: 操作成功,返回(),操作失败,返回错误码
805 pub fn device_unregister<T: Device>(_device: Arc<T>) {
806     // DEVICE_MANAGER.add_device(device.id_table(), device.clone());
807     // match sys_device_unregister(&device.id_table().name()) {
808     //     Ok(_) => {
809     //         device.set_inode(None);
810     //         return Ok(());
811     //     }
812     //     Err(_) => Err(DeviceError::RegisterError),
813     // }
814     todo!("device_unregister")
815 }
816 
817 /// 设备文件夹下的`dev`文件的属性
818 #[derive(Debug, Clone, Copy)]
819 pub struct DeviceAttrDev;
820 
821 impl Attribute for DeviceAttrDev {
822     fn mode(&self) -> ModeType {
823         // 0o444
824         return ModeType::S_IRUGO;
825     }
826 
827     fn name(&self) -> &str {
828         "dev"
829     }
830 
831     fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
832         let dev = kobj.cast::<dyn Device>().map_err(|kobj| {
833             kerror!(
834                 "Intertrait casting not implemented for kobj: {}",
835                 kobj.name()
836             );
837             SystemError::EOPNOTSUPP_OR_ENOTSUP
838         })?;
839 
840         let device_number = dev.id_table().device_number();
841         let s = format!(
842             "{}:{}\n",
843             device_number.major().data(),
844             device_number.minor()
845         );
846 
847         return sysfs_emit_str(buf, &s);
848     }
849 
850     fn support(&self) -> SysFSOpsSupport {
851         SysFSOpsSupport::ATTR_SHOW
852     }
853 }
854 
855 /// 设备匹配器
856 ///
857 /// 用于匹配设备是否符合某个条件
858 ///
859 /// ## 参数
860 ///
861 /// - `T` - 匹配器的数据类型
862 /// - `data` - 匹配器的数据
863 pub trait DeviceMatcher<T>: Debug {
864     fn match_device(&self, device: &Arc<dyn Device>, data: T) -> bool;
865 }
866 
867 /// 用于根据名称匹配设备的匹配器
868 #[derive(Debug)]
869 pub struct DeviceMatchName;
870 
871 impl DeviceMatcher<&str> for DeviceMatchName {
872     #[inline]
873     fn match_device(&self, device: &Arc<dyn Device>, data: &str) -> bool {
874         return device.name() == data;
875     }
876 }
877 
878 /// Cookie to identify the device
879 #[derive(Debug, Clone, Hash)]
880 pub struct DeviceId {
881     data: Option<&'static str>,
882     allocated: Option<String>,
883 }
884 
885 impl DeviceId {
886     #[allow(dead_code)]
887     pub fn new(data: Option<&'static str>, allocated: Option<String>) -> Option<Arc<Self>> {
888         if data.is_none() && allocated.is_none() {
889             return None;
890         }
891 
892         // 如果data和allocated都有值,那么返回None
893         if data.is_some() && allocated.is_some() {
894             return None;
895         }
896 
897         return Some(Arc::new(Self { data, allocated }));
898     }
899 
900     pub fn id(&self) -> Option<&str> {
901         if self.data.is_some() {
902             return Some(self.data.unwrap());
903         } else {
904             return self.allocated.as_deref();
905         }
906     }
907 
908     #[allow(dead_code)]
909     pub fn set_allocated(&mut self, allocated: String) {
910         self.allocated = Some(allocated);
911         self.data = None;
912     }
913 }
914 
915 impl PartialEq for DeviceId {
916     fn eq(&self, other: &Self) -> bool {
917         return self.id() == other.id();
918     }
919 }
920 
921 impl Eq for DeviceId {}
922 
923 impl IrqHandlerData for DeviceId {}
924