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