xref: /DragonOS/kernel/src/driver/base/device/driver.rs (revision 4b0170bd6bb374d0e9699a0076cc23b976ad6db7)
1 use super::{
2     bus::{bus_manager, Bus},
3     Device, DeviceMatchName, DeviceMatcher, IdTable,
4 };
5 use crate::{
6     driver::base::kobject::KObject,
7     filesystem::sysfs::{sysfs_instance, Attribute, AttributeGroup},
8 };
9 use alloc::{
10     sync::{Arc, Weak},
11     vec::Vec,
12 };
13 use core::fmt::Debug;
14 use system_error::SystemError;
15 
16 /// @brief: Driver error
17 #[allow(dead_code)]
18 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
19 pub enum DriverError {
20     ProbeError,            // 探测设备失败(该驱动不能初始化这个设备)
21     RegisterError,         // 设备注册失败
22     AllocateResourceError, // 获取设备所需资源失败
23     UnsupportedOperation,  // 不支持的操作
24     UnInitialized,         // 未初始化
25 }
26 
27 impl From<DriverError> for SystemError {
28     fn from(value: DriverError) -> Self {
29         match value {
30             DriverError::ProbeError => SystemError::ENODEV,
31             DriverError::RegisterError => SystemError::ENODEV,
32             DriverError::AllocateResourceError => SystemError::EIO,
33             DriverError::UnsupportedOperation => SystemError::EIO,
34             DriverError::UnInitialized => SystemError::ENODEV,
35         }
36     }
37 }
38 
39 #[inline(always)]
40 pub fn driver_manager() -> &'static DriverManager {
41     &DriverManager
42 }
43 
44 /// 驱动程序应当实现的trait
45 ///
46 /// ## 注意
47 ///
48 /// 由于设备驱动模型需要从Arc<dyn KObject>转换为Arc<dyn Driver>,
49 /// 因此,所有的实现了 Driver trait的结构体,都应该在结构体上方标注`#[cast_to([sync] Driver)]`,
50 /// 否则在运行时会报错
51 pub trait Driver: Sync + Send + Debug + KObject {
52     fn coredump(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
53         Err(SystemError::ENOSYS)
54     }
55 
56     /// @brief: 获取驱动标识符
57     /// @parameter: None
58     /// @return: 该驱动驱动唯一标识符
59     fn id_table(&self) -> Option<IdTable>;
60 
61     fn devices(&self) -> Vec<Arc<dyn Device>>;
62 
63     /// 把设备加入当前驱动管理的列表中
64     fn add_device(&self, device: Arc<dyn Device>);
65 
66     /// 从当前驱动管理的列表中删除设备
67     fn delete_device(&self, device: &Arc<dyn Device>);
68 
69     /// 根据设备名称查找绑定到驱动的设备
70     ///
71     /// 该方法是一个快速查找方法,要求驱动开发者自行实现。
72     ///
73     /// 如果开发者没有实现该方法,则应当返回None
74     ///
75     /// ## 注意
76     ///
77     /// 这是一个内部方法,不应当被外部调用,若要查找设备,请使用`find_device_by_name()`
78     fn __find_device_by_name_fast(&self, _name: &str) -> Option<Arc<dyn Device>> {
79         None
80     }
81 
82     /// 是否禁用sysfs的bind/unbind属性
83     ///
84     /// ## 返回
85     ///
86     /// - true: 禁用
87     /// - false: 不禁用(默认)
88     fn suppress_bind_attrs(&self) -> bool {
89         false
90     }
91 
92     fn bus(&self) -> Option<Weak<dyn Bus>> {
93         None
94     }
95 
96     fn set_bus(&self, bus: Option<Weak<dyn Bus>>);
97 
98     fn groups(&self) -> &'static [&'static dyn AttributeGroup] {
99         &[]
100     }
101 
102     fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] {
103         &[]
104     }
105 
106     /// 使用什么样的策略来探测设备
107     fn probe_type(&self) -> DriverProbeType {
108         DriverProbeType::DefaultStrategy
109     }
110 }
111 
112 #[derive(Debug, Default)]
113 pub struct DriverCommonData {
114     pub devices: Vec<Arc<dyn Device>>,
115     pub bus: Option<Weak<dyn Bus>>,
116 }
117 
118 impl DriverCommonData {
119     pub fn push_device(&mut self, device: Arc<dyn Device>) {
120         if !self.devices.iter().any(|d| Arc::ptr_eq(d, &device)) {
121             self.devices.push(device);
122         }
123     }
124 
125     pub fn delete_device(&mut self, device: &Arc<dyn Device>) {
126         self.devices.retain(|d| !Arc::ptr_eq(d, device));
127     }
128 }
129 
130 impl dyn Driver {
131     pub fn allows_async_probing(&self) -> bool {
132         match self.probe_type() {
133             DriverProbeType::PreferAsync => true,
134             DriverProbeType::ForceSync => false,
135             DriverProbeType::DefaultStrategy => {
136                 // todo: 判断是否请求异步探测,如果是的话,就返回true
137 
138                 // 由于目前还没有支持异步探测,因此这里暂时返回false
139                 false
140             }
141         }
142     }
143 
144     /// 根据条件寻找一个绑定到这个驱动的设备(低效实现)
145     ///
146     /// ## 参数
147     ///
148     /// - `matcher` - 匹配器
149     /// - `data` - 传给匹配器的数据
150     ///
151     /// ## 注意
152     ///
153     /// 这里的默认实现很低效,请为特定的驱动自行实现高效的查询
154     fn find_device_slow<T: Copy>(
155         &self,
156         matcher: &dyn DeviceMatcher<T>,
157         data: T,
158     ) -> Option<Arc<dyn Device>> {
159         self.devices()
160             .into_iter()
161             .find(|dev| matcher.match_device(dev, data))
162     }
163 
164     /// 根据设备名称查找绑定到驱动的设备
165     ///
166     /// ## 注意
167     ///
168     /// 这里的默认实现很低效,请为特定的驱动自行实现高效的查询
169     pub fn find_device_by_name(&self, name: &str) -> Option<Arc<dyn Device>> {
170         if let Some(r) = self.__find_device_by_name_fast(name) {
171             return Some(r);
172         }
173 
174         return self.find_device_slow(&DeviceMatchName, name);
175     }
176 }
177 
178 /// @brief: 驱动管理器
179 #[derive(Debug, Clone)]
180 pub struct DriverManager;
181 
182 impl DriverManager {
183     /// 注册设备驱动。该设备驱动应当已经设置好其bus字段
184     ///
185     /// ## 参数
186     ///
187     /// - driver: 驱动
188     ///
189     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/driver.c#222
190     pub fn register(&self, driver: Arc<dyn Driver>) -> Result<(), SystemError> {
191         let bus = driver.bus().and_then(|bus| bus.upgrade()).ok_or_else(|| {
192             kerror!(
193                 "DriverManager::register() failed: driver.bus() is None. Driver: '{:?}'",
194                 driver.name()
195             );
196             SystemError::EINVAL
197         })?;
198 
199         let drv_name = driver.name();
200         let other = bus.find_driver_by_name(&drv_name);
201         if other.is_some() {
202             kerror!(
203                 "DriverManager::register() failed: driver '{}' already registered",
204                 drv_name
205             );
206             return Err(SystemError::EBUSY);
207         }
208 
209         bus_manager().add_driver(&driver)?;
210 
211         self.add_groups(&driver, driver.groups()).map_err(|e| {
212             bus_manager().remove_driver(&driver);
213             e
214         })?;
215 
216         // todo: 发送uevent
217 
218         return Ok(());
219     }
220 
221     /// 从系统中删除一个驱动程序
222     #[allow(dead_code)]
223     pub fn unregister(&self, driver: &Arc<dyn Driver>) {
224         self.remove_groups(driver, driver.groups());
225         bus_manager().remove_driver(driver);
226     }
227 
228     /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c#434
229     pub fn driver_sysfs_add(&self, _dev: &Arc<dyn Device>) -> Result<(), SystemError> {
230         todo!("DriverManager::driver_sysfs_add()");
231     }
232 
233     pub fn add_groups(
234         &self,
235         driver: &Arc<dyn Driver>,
236         groups: &'static [&dyn AttributeGroup],
237     ) -> Result<(), SystemError> {
238         let kobj = driver.clone() as Arc<dyn KObject>;
239         return sysfs_instance().create_groups(&kobj, groups);
240     }
241 
242     pub fn remove_groups(&self, driver: &Arc<dyn Driver>, groups: &'static [&dyn AttributeGroup]) {
243         let kobj = driver.clone() as Arc<dyn KObject>;
244         sysfs_instance().remove_groups(&kobj, groups);
245     }
246 
247     /// 为指定的驱动创建一个属性文件
248     ///
249     /// ## 参数
250     ///
251     /// - `driver` 要创建属性文件的驱动
252     /// - `attr` 属性
253     pub fn create_attr_file(
254         &self,
255         driver: &Arc<dyn Driver>,
256         attr: &'static dyn Attribute,
257     ) -> Result<(), SystemError> {
258         let kobj = driver.clone() as Arc<dyn KObject>;
259         return sysfs_instance().create_file(&kobj, attr);
260     }
261 
262     /// 为指定的驱动删除一个属性文件
263     ///
264     /// 如果属性不存在,也不会报错
265     ///
266     /// ## 参数
267     ///
268     /// - `driver` 要删除属性文件的驱动
269     /// - `attr` 属性
270     pub fn remove_attr_file(&self, driver: &Arc<dyn Driver>, attr: &'static dyn Attribute) {
271         let kobj = driver.clone() as Arc<dyn KObject>;
272         sysfs_instance().remove_file(&kobj, attr);
273     }
274 }
275 
276 /// 驱动匹配器
277 ///
278 /// 用于匹配驱动是否符合某个条件
279 ///
280 /// ## 参数
281 ///
282 /// - `T` - 匹配器的数据类型
283 /// - `data` - 匹配器的数据
284 pub trait DriverMatcher<T>: Debug {
285     fn match_driver(&self, driver: &Arc<dyn Driver>, data: T) -> bool;
286 }
287 
288 /// 根据名称匹配驱动
289 #[derive(Debug)]
290 pub struct DriverMatchName;
291 
292 impl DriverMatcher<&str> for DriverMatchName {
293     #[inline(always)]
294     fn match_driver(&self, driver: &Arc<dyn Driver>, data: &str) -> bool {
295         driver.name() == data
296     }
297 }
298 
299 /// enum probe_type - device driver probe type to try
300 /// Device drivers may opt in for special handling of their
301 /// respective probe routines. This tells the core what to
302 /// expect and prefer.
303 ///
304 /// Note that the end goal is to switch the kernel to use asynchronous
305 /// probing by default, so annotating drivers with
306 /// %PROBE_PREFER_ASYNCHRONOUS is a temporary measure that allows us
307 /// to speed up boot process while we are validating the rest of the
308 /// drivers.
309 #[allow(dead_code)]
310 #[derive(Debug, Default)]
311 pub enum DriverProbeType {
312     /// Drivers for "slow" devices which
313     /// probing order is not essential for booting the system may
314     /// opt into executing their probes asynchronously.
315     PreferAsync,
316 
317     /// Use this to annotate drivers that need
318     /// their probe routines to run synchronously with driver and
319     /// device registration (with the exception of -EPROBE_DEFER
320     /// handling - re-probing always ends up being done asynchronously).
321     ForceSync,
322 
323     #[default]
324     /// Used by drivers that work equally well
325     /// whether probed synchronously or asynchronously.
326     DefaultStrategy,
327 }
328