platform_device.rs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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, DeviceCommonData, DevicePrivateData, DeviceType, IdTable,
  14. },
  15. kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
  16. kset::KSet,
  17. },
  18. filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup},
  19. libs::{
  20. rwlock::{RwLockReadGuard, RwLockWriteGuard},
  21. spinlock::{SpinLock, SpinLockGuard},
  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: SpinLock<IdAllocator> =
  28. SpinLock::new(IdAllocator::new(0, i32::MAX as usize).unwrap());
  29. #[inline(always)]
  30. pub fn platform_device_manager() -> &'static PlatformDeviceManager {
  31. &PlatformDeviceManager
  32. }
  33. /// 没有平台设备id
  34. pub const PLATFORM_DEVID_NONE: i32 = -1;
  35. /// 请求自动分配这个平台设备id
  36. pub const PLATFORM_DEVID_AUTO: i32 = -2;
  37. /// @brief: 实现该trait的设备实例应挂载在platform总线上,
  38. /// 同时应该实现Device trait
  39. ///
  40. /// ## 注意
  41. ///
  42. /// 应当在所有实现这个trait的结构体上方,添加 `#[cast_to([sync] PlatformDevice)]`,
  43. /// 否则运行时将报错“该对象不是PlatformDevice”
  44. pub trait PlatformDevice: Device {
  45. fn pdev_name(&self) -> &str;
  46. /// 返回平台设备id,以及这个id是否是自动生成的
  47. ///
  48. /// 请注意,如果当前设备还没有id,应该返回
  49. /// (PLATFORM_DEVID_NONE, false)
  50. fn pdev_id(&self) -> (i32, bool) {
  51. (PLATFORM_DEVID_NONE, false)
  52. }
  53. /// 设置平台设备id
  54. fn set_pdev_id(&self, id: i32);
  55. /// 设置id是否为自动分配
  56. fn set_pdev_id_auto(&self, id_auto: bool);
  57. /// @brief: 判断设备是否初始化
  58. /// @parameter: None
  59. /// @return: 如果已经初始化,返回true,否则,返回false
  60. #[allow(dead_code)]
  61. fn is_initialized(&self) -> bool;
  62. /// @brief: 设置设备状态
  63. /// @parameter set_state: 设备状态
  64. /// @return: None
  65. fn set_state(&self, set_state: DeviceState);
  66. }
  67. #[derive(Debug)]
  68. pub struct PlatformDeviceManager;
  69. impl PlatformDeviceManager {
  70. /// platform_device_add - add a platform device to device hierarchy
  71. pub fn device_add(&self, pdev: Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
  72. if pdev.dev_parent().is_none() {
  73. pdev.set_dev_parent(Some(Arc::downgrade(
  74. &(platform_bus_device() as Arc<dyn Device>),
  75. )));
  76. }
  77. pdev.set_bus(Some(Arc::downgrade(&(platform_bus() as Arc<dyn Bus>))));
  78. let id = pdev.pdev_id().0;
  79. match id {
  80. PLATFORM_DEVID_NONE => {
  81. pdev.set_name(pdev.pdev_name().to_string());
  82. }
  83. PLATFORM_DEVID_AUTO => {
  84. let id = PLATFORM_DEVID_IDA
  85. .lock()
  86. .alloc()
  87. .ok_or(SystemError::EOVERFLOW)?;
  88. pdev.set_pdev_id(id as i32);
  89. pdev.set_pdev_id_auto(true);
  90. pdev.set_name(format!("{}.{}.auto", pdev.pdev_name(), pdev.pdev_id().0));
  91. }
  92. _ => {
  93. pdev.set_name(format!("{}.{}", pdev.pdev_name(), id));
  94. }
  95. }
  96. // todo: 插入资源: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/platform.c?fi=platform_device_add#691
  97. let r = device_manager().add_device(pdev.clone() as Arc<dyn Device>);
  98. if r.is_ok() {
  99. pdev.set_state(DeviceState::Initialized);
  100. return Ok(()); // success
  101. } else {
  102. // failed
  103. let pdevid = pdev.pdev_id();
  104. if pdevid.1 {
  105. PLATFORM_DEVID_IDA.lock().free(pdevid.0 as usize);
  106. pdev.set_pdev_id(PLATFORM_DEVID_AUTO);
  107. }
  108. return r;
  109. }
  110. }
  111. }
  112. #[derive(Debug)]
  113. #[cast_to([sync] Device)]
  114. pub struct PlatformBusDevice {
  115. inner: SpinLock<InnerPlatformBusDevice>,
  116. kobj_state: LockedKObjectState,
  117. }
  118. impl PlatformBusDevice {
  119. /// @brief: 创建一个加锁的platform总线实例
  120. /// @parameter: None
  121. /// @return: platform总线实例
  122. pub fn new(
  123. data: DevicePrivateData,
  124. parent: Option<Weak<dyn KObject>>,
  125. ) -> Arc<PlatformBusDevice> {
  126. let platform_bus_device = Self {
  127. inner: SpinLock::new(InnerPlatformBusDevice::new(data)),
  128. kobj_state: LockedKObjectState::new(None),
  129. };
  130. platform_bus_device.set_parent(parent);
  131. return Arc::new(platform_bus_device);
  132. }
  133. /// @brief: 获取总线的匹配表
  134. /// @parameter: None
  135. /// @return: platform总线匹配表
  136. #[inline]
  137. #[allow(dead_code)]
  138. fn compatible_table(&self) -> CompatibleTable {
  139. CompatibleTable::new(vec!["platform"])
  140. }
  141. /// @brief: 判断总线是否初始化
  142. /// @parameter: None
  143. /// @return: 已初始化,返回true,否则,返回false
  144. #[inline]
  145. #[allow(dead_code)]
  146. fn is_initialized(&self) -> bool {
  147. let state = self.inner.lock().state;
  148. matches!(state, BusState::Initialized)
  149. }
  150. /// @brief: 设置总线状态
  151. /// @parameter set_state: 总线状态BusState
  152. /// @return: None
  153. #[inline]
  154. #[allow(dead_code)]
  155. fn set_state(&self, set_state: BusState) {
  156. let state = &mut self.inner.lock().state;
  157. *state = set_state;
  158. }
  159. /// @brief: 获取总线状态
  160. /// @parameter: None
  161. /// @return: 总线状态
  162. #[inline]
  163. #[allow(dead_code)]
  164. fn get_state(&self) -> BusState {
  165. let state = self.inner.lock().state;
  166. return state;
  167. }
  168. fn inner(&self) -> SpinLockGuard<InnerPlatformBusDevice> {
  169. self.inner.lock()
  170. }
  171. }
  172. #[allow(dead_code)]
  173. #[derive(Debug)]
  174. pub struct InnerPlatformBusDevice {
  175. name: String,
  176. data: DevicePrivateData,
  177. state: BusState, // 总线状态
  178. kobject_common: KObjectCommonData,
  179. device_common: DeviceCommonData,
  180. }
  181. impl InnerPlatformBusDevice {
  182. pub fn new(data: DevicePrivateData) -> Self {
  183. Self {
  184. data,
  185. name: "platform".to_string(),
  186. state: BusState::NotInitialized,
  187. kobject_common: KObjectCommonData::default(),
  188. device_common: DeviceCommonData::default(),
  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().kobject_common.parent.clone()
  198. }
  199. fn inode(&self) -> Option<Arc<KernFSInode>> {
  200. self.inner().kobject_common.kern_inode.clone()
  201. }
  202. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  203. self.inner().kobject_common.kern_inode = inode;
  204. }
  205. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  206. self.inner().kobject_common.kobj_type
  207. }
  208. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  209. self.inner().kobject_common.kobj_type = ktype;
  210. }
  211. fn kset(&self) -> Option<Arc<KSet>> {
  212. self.inner().kobject_common.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().name.clone()
  225. }
  226. fn set_name(&self, name: String) {
  227. self.inner().name = name;
  228. }
  229. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  230. self.inner().kobject_common.kset = kset;
  231. }
  232. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  233. self.inner().kobject_common.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().device_common.bus.clone()
  249. }
  250. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  251. self.inner().device_common.bus = bus;
  252. }
  253. fn driver(&self) -> Option<Arc<dyn Driver>> {
  254. self.inner().device_common.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().device_common.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. self.inner().device_common.class = class;
  274. }
  275. fn dev_parent(&self) -> Option<Weak<dyn Device>> {
  276. self.inner().device_common.get_parent_weak_or_clear()
  277. }
  278. fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
  279. self.inner().device_common.parent = dev_parent;
  280. }
  281. fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
  282. None
  283. }
  284. }