platform_device.rs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. use alloc::{
  2. string::{String, ToString},
  3. sync::{Arc, Weak},
  4. };
  5. use ida::IdAllocator;
  6. use crate::{
  7. driver::base::{
  8. class::Class,
  9. device::{
  10. bus::{Bus, BusState},
  11. device_manager,
  12. driver::Driver,
  13. Device, DevicePrivateData, DeviceType, IdTable,
  14. },
  15. kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
  16. kset::KSet,
  17. },
  18. filesystem::kernfs::KernFSInode,
  19. libs::{
  20. rwlock::{RwLockReadGuard, RwLockWriteGuard},
  21. spinlock::SpinLock,
  22. },
  23. };
  24. use system_error::SystemError;
  25. use super::{super::device::DeviceState, platform_bus, platform_bus_device, CompatibleTable};
  26. /// 平台设备id分配器
  27. static PLATFORM_DEVID_IDA: IdAllocator = IdAllocator::new(0, i32::MAX as usize);
  28. #[inline(always)]
  29. pub fn platform_device_manager() -> &'static PlatformDeviceManager {
  30. &PlatformDeviceManager
  31. }
  32. /// 没有平台设备id
  33. pub const PLATFORM_DEVID_NONE: i32 = -1;
  34. /// 请求自动分配这个平台设备id
  35. pub const PLATFORM_DEVID_AUTO: i32 = -2;
  36. /// @brief: 实现该trait的设备实例应挂载在platform总线上,
  37. /// 同时应该实现Device trait
  38. ///
  39. /// ## 注意
  40. ///
  41. /// 应当在所有实现这个trait的结构体上方,添加 `#[cast_to([sync] PlatformDevice)]`,
  42. /// 否则运行时将报错“该对象不是PlatformDevice”
  43. pub trait PlatformDevice: Device {
  44. fn pdev_name(&self) -> &str;
  45. /// 返回平台设备id,以及这个id是否是自动生成的
  46. ///
  47. /// 请注意,如果当前设备还没有id,应该返回
  48. /// (PLATFORM_DEVID_NONE, false)
  49. fn pdev_id(&self) -> (i32, bool) {
  50. (PLATFORM_DEVID_NONE, false)
  51. }
  52. /// 设置平台设备id
  53. fn set_pdev_id(&self, id: i32);
  54. /// 设置id是否为自动分配
  55. fn set_pdev_id_auto(&self, id_auto: bool);
  56. /// @brief: 判断设备是否初始化
  57. /// @parameter: None
  58. /// @return: 如果已经初始化,返回true,否则,返回false
  59. fn is_initialized(&self) -> bool;
  60. /// @brief: 设置设备状态
  61. /// @parameter set_state: 设备状态
  62. /// @return: None
  63. fn set_state(&self, set_state: DeviceState);
  64. }
  65. #[derive(Debug)]
  66. pub struct PlatformDeviceManager;
  67. impl PlatformDeviceManager {
  68. /// platform_device_add - add a platform device to device hierarchy
  69. pub fn device_add(&self, pdev: Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
  70. if pdev.parent().is_none() {
  71. pdev.set_parent(Some(Arc::downgrade(
  72. &(platform_bus_device() as Arc<dyn KObject>),
  73. )));
  74. }
  75. pdev.set_bus(Some(Arc::downgrade(&(platform_bus() as Arc<dyn Bus>))));
  76. let id = pdev.pdev_id().0;
  77. match id {
  78. PLATFORM_DEVID_NONE => {
  79. pdev.set_name(pdev.pdev_name().to_string());
  80. }
  81. PLATFORM_DEVID_AUTO => {
  82. let id = PLATFORM_DEVID_IDA.alloc().ok_or(SystemError::EOVERFLOW)?;
  83. pdev.set_pdev_id(id as i32);
  84. pdev.set_pdev_id_auto(true);
  85. pdev.set_name(format!("{}.{}.auto", pdev.pdev_name(), pdev.pdev_id().0));
  86. }
  87. _ => {
  88. pdev.set_name(format!("{}.{}", pdev.pdev_name(), id));
  89. }
  90. }
  91. // todo: 插入资源: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/platform.c?fi=platform_device_add#691
  92. let r = device_manager().add_device(pdev.clone() as Arc<dyn Device>);
  93. if r.is_ok() {
  94. pdev.set_state(DeviceState::Initialized);
  95. return Ok(()); // success
  96. } else {
  97. // failed
  98. let pdevid = pdev.pdev_id();
  99. if pdevid.1 {
  100. PLATFORM_DEVID_IDA.free(pdevid.0 as usize);
  101. pdev.set_pdev_id(PLATFORM_DEVID_AUTO);
  102. }
  103. return r;
  104. }
  105. }
  106. }
  107. #[derive(Debug)]
  108. #[cast_to([sync] Device)]
  109. pub struct PlatformBusDevice {
  110. inner: SpinLock<InnerPlatformBusDevice>,
  111. kobj_state: LockedKObjectState,
  112. }
  113. impl PlatformBusDevice {
  114. /// @brief: 创建一个加锁的platform总线实例
  115. /// @parameter: None
  116. /// @return: platform总线实例
  117. pub fn new(
  118. data: DevicePrivateData,
  119. parent: Option<Weak<dyn KObject>>,
  120. ) -> Arc<PlatformBusDevice> {
  121. return Arc::new(PlatformBusDevice {
  122. inner: SpinLock::new(InnerPlatformBusDevice::new(data, parent)),
  123. kobj_state: LockedKObjectState::new(None),
  124. });
  125. }
  126. /// @brief: 获取总线的匹配表
  127. /// @parameter: None
  128. /// @return: platform总线匹配表
  129. #[inline]
  130. #[allow(dead_code)]
  131. fn compatible_table(&self) -> CompatibleTable {
  132. CompatibleTable::new(vec!["platform"])
  133. }
  134. /// @brief: 判断总线是否初始化
  135. /// @parameter: None
  136. /// @return: 已初始化,返回true,否则,返回false
  137. #[inline]
  138. #[allow(dead_code)]
  139. fn is_initialized(&self) -> bool {
  140. let state = self.inner.lock().state;
  141. matches!(state, BusState::Initialized)
  142. }
  143. /// @brief: 设置总线状态
  144. /// @parameter set_state: 总线状态BusState
  145. /// @return: None
  146. #[inline]
  147. #[allow(dead_code)]
  148. fn set_state(&self, set_state: BusState) {
  149. let state = &mut self.inner.lock().state;
  150. *state = set_state;
  151. }
  152. /// @brief: 获取总线状态
  153. /// @parameter: None
  154. /// @return: 总线状态
  155. #[inline]
  156. #[allow(dead_code)]
  157. fn get_state(&self) -> BusState {
  158. let state = self.inner.lock().state;
  159. return state;
  160. }
  161. }
  162. #[allow(dead_code)]
  163. #[derive(Debug, Clone)]
  164. pub struct InnerPlatformBusDevice {
  165. name: String,
  166. data: DevicePrivateData,
  167. state: BusState, // 总线状态
  168. parent: Option<Weak<dyn KObject>>, // 总线的父对象
  169. kernfs_inode: Option<Arc<KernFSInode>>,
  170. /// 当前设备挂载到的总线
  171. bus: Option<Weak<dyn Bus>>,
  172. /// 当前设备已经匹配的驱动
  173. driver: Option<Weak<dyn Driver>>,
  174. ktype: Option<&'static dyn KObjType>,
  175. kset: Option<Arc<KSet>>,
  176. }
  177. impl InnerPlatformBusDevice {
  178. pub fn new(data: DevicePrivateData, parent: Option<Weak<dyn KObject>>) -> Self {
  179. Self {
  180. data,
  181. name: "platform".to_string(),
  182. state: BusState::NotInitialized,
  183. parent,
  184. kernfs_inode: None,
  185. bus: None,
  186. driver: None,
  187. ktype: None,
  188. kset: None,
  189. }
  190. }
  191. }
  192. impl KObject for PlatformBusDevice {
  193. fn as_any_ref(&self) -> &dyn core::any::Any {
  194. self
  195. }
  196. fn parent(&self) -> Option<Weak<dyn KObject>> {
  197. self.inner.lock().parent.clone()
  198. }
  199. fn inode(&self) -> Option<Arc<KernFSInode>> {
  200. self.inner.lock().kernfs_inode.clone()
  201. }
  202. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  203. self.inner.lock().kernfs_inode = inode;
  204. }
  205. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  206. self.inner.lock().ktype
  207. }
  208. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  209. self.inner.lock().ktype = ktype;
  210. }
  211. fn kset(&self) -> Option<Arc<KSet>> {
  212. self.inner.lock().kset.clone()
  213. }
  214. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  215. self.kobj_state.read()
  216. }
  217. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  218. self.kobj_state.write()
  219. }
  220. fn set_kobj_state(&self, state: KObjectState) {
  221. *self.kobj_state.write() = state;
  222. }
  223. fn name(&self) -> String {
  224. self.inner.lock().name.clone()
  225. }
  226. fn set_name(&self, name: String) {
  227. self.inner.lock().name = name;
  228. }
  229. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  230. self.inner.lock().kset = kset;
  231. }
  232. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  233. self.inner.lock().parent = parent;
  234. }
  235. }
  236. /// @brief: 为Platform实现Device trait,platform总线也是一种设备,属于总线设备类型
  237. impl Device for PlatformBusDevice {
  238. #[inline]
  239. #[allow(dead_code)]
  240. fn dev_type(&self) -> DeviceType {
  241. return DeviceType::Bus;
  242. }
  243. #[inline]
  244. fn id_table(&self) -> IdTable {
  245. IdTable::new("platform".to_string(), None)
  246. }
  247. fn bus(&self) -> Option<Weak<dyn Bus>> {
  248. self.inner.lock().bus.clone()
  249. }
  250. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  251. self.inner.lock().bus = bus;
  252. }
  253. fn driver(&self) -> Option<Arc<dyn Driver>> {
  254. self.inner.lock().driver.clone()?.upgrade()
  255. }
  256. #[inline]
  257. fn is_dead(&self) -> bool {
  258. false
  259. }
  260. fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
  261. self.inner.lock().driver = driver;
  262. }
  263. fn can_match(&self) -> bool {
  264. todo!()
  265. }
  266. fn set_can_match(&self, _can_match: bool) {
  267. todo!()
  268. }
  269. fn state_synced(&self) -> bool {
  270. todo!()
  271. }
  272. fn set_class(&self, _class: Option<Weak<dyn Class>>) {
  273. todo!()
  274. }
  275. }