mod.rs 33 KB

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