mod.rs 26 KB

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