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