sysfs.rs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. use alloc::{
  2. string::String,
  3. sync::{Arc, Weak},
  4. };
  5. use ida::IdAllocator;
  6. use system_error::SystemError;
  7. use crate::{
  8. driver::base::{
  9. class::Class,
  10. device::{
  11. bus::Bus, device_manager, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable,
  12. },
  13. kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
  14. kset::KSet,
  15. },
  16. filesystem::{
  17. kernfs::KernFSInode,
  18. sysfs::{
  19. file::sysfs_emit_str, Attribute, AttributeGroup, SysFSOpsSupport, SYSFS_ATTR_MODE_RO,
  20. },
  21. vfs::syscall::ModeType,
  22. },
  23. libs::{
  24. rwlock::{RwLockReadGuard, RwLockWriteGuard},
  25. spinlock::{SpinLock, SpinLockGuard},
  26. },
  27. };
  28. use super::{
  29. class::sys_class_rtc_instance,
  30. interface::rtc_read_time,
  31. utils::{kobj2rtc_device, kobj2rtc_general_device},
  32. GeneralRtcPriority, RtcClassOps, RtcDevice,
  33. };
  34. static RTC_GENERAL_DEVICE_IDA: SpinLock<IdAllocator> =
  35. SpinLock::new(IdAllocator::new(0, usize::MAX).unwrap());
  36. pub(super) const RTC_HCTOSYS_DEVICE: &str = "rtc0";
  37. #[derive(Debug)]
  38. #[cast_to([sync] KObject, Device, RtcDevice)]
  39. pub struct RtcGeneralDevice {
  40. name: String,
  41. id: usize,
  42. inner: SpinLock<InnerRtcGeneralDevice>,
  43. kobj_state: LockedKObjectState,
  44. priority: GeneralRtcPriority,
  45. }
  46. #[derive(Debug)]
  47. struct InnerRtcGeneralDevice {
  48. device_common: DeviceCommonData,
  49. kobject_common: KObjectCommonData,
  50. class_ops: Option<&'static dyn RtcClassOps>,
  51. /// 上一次调用`rtc_hctosys()`把时间同步到timekeeper的时候的返回值
  52. hc2sysfs_result: Result<(), SystemError>,
  53. }
  54. impl RtcGeneralDevice {
  55. /// 创建一个新的通用RTC设备实例
  56. ///
  57. /// 注意,由于还需要进行其他的初始化操作,因此这个函数并不是公开的构造函数。
  58. fn new(priority: GeneralRtcPriority) -> Arc<Self> {
  59. let id = RTC_GENERAL_DEVICE_IDA.lock().alloc().unwrap();
  60. let name = format!("rtc{}", id);
  61. Arc::new(Self {
  62. name,
  63. id,
  64. inner: SpinLock::new(InnerRtcGeneralDevice {
  65. device_common: DeviceCommonData::default(),
  66. kobject_common: KObjectCommonData::default(),
  67. class_ops: None,
  68. hc2sysfs_result: Err(SystemError::ENODEV),
  69. }),
  70. kobj_state: LockedKObjectState::new(None),
  71. priority,
  72. })
  73. }
  74. fn inner(&self) -> SpinLockGuard<InnerRtcGeneralDevice> {
  75. self.inner.lock()
  76. }
  77. pub fn set_class_ops(&self, class_ops: &'static dyn RtcClassOps) {
  78. self.inner().class_ops = Some(class_ops);
  79. }
  80. pub fn class_ops(&self) -> Option<&'static dyn RtcClassOps> {
  81. self.inner().class_ops
  82. }
  83. pub fn priority(&self) -> GeneralRtcPriority {
  84. self.priority
  85. }
  86. pub(super) fn set_hc2sys_result(&self, val: Result<(), SystemError>) {
  87. self.inner().hc2sysfs_result = val;
  88. }
  89. pub(super) fn hc2sysfs_result(&self) -> Result<(), SystemError> {
  90. self.inner().hc2sysfs_result.clone()
  91. }
  92. }
  93. impl Drop for RtcGeneralDevice {
  94. fn drop(&mut self) {
  95. RTC_GENERAL_DEVICE_IDA.lock().free(self.id);
  96. }
  97. }
  98. impl RtcDevice for RtcGeneralDevice {
  99. fn class_ops(&self) -> &'static dyn super::RtcClassOps {
  100. todo!()
  101. }
  102. }
  103. impl Device for RtcGeneralDevice {
  104. fn dev_type(&self) -> DeviceType {
  105. DeviceType::Rtc
  106. }
  107. fn id_table(&self) -> IdTable {
  108. IdTable::new(self.name.clone(), None)
  109. }
  110. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  111. self.inner().device_common.bus = bus;
  112. }
  113. fn bus(&self) -> Option<Weak<dyn Bus>> {
  114. self.inner().device_common.get_bus_weak_or_clear()
  115. }
  116. fn set_class(&self, class: Option<Weak<dyn Class>>) {
  117. self.inner().device_common.class = class;
  118. }
  119. fn class(&self) -> Option<Arc<dyn Class>> {
  120. self.inner()
  121. .device_common
  122. .get_class_weak_or_clear()
  123. .and_then(|x| x.upgrade())
  124. }
  125. fn driver(&self) -> Option<Arc<dyn Driver>> {
  126. self.inner()
  127. .device_common
  128. .get_driver_weak_or_clear()
  129. .and_then(|x| x.upgrade())
  130. }
  131. fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
  132. self.inner().device_common.driver = driver;
  133. }
  134. fn is_dead(&self) -> bool {
  135. false
  136. }
  137. fn can_match(&self) -> bool {
  138. false
  139. }
  140. fn set_can_match(&self, _can_match: bool) {
  141. // do nothing
  142. }
  143. fn state_synced(&self) -> bool {
  144. true
  145. }
  146. fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
  147. Some(&[&RtcAttrGroup])
  148. }
  149. fn dev_parent(&self) -> Option<Weak<dyn Device>> {
  150. self.inner().device_common.get_parent_weak_or_clear()
  151. }
  152. fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
  153. self.inner().device_common.parent = dev_parent;
  154. }
  155. }
  156. impl KObject for RtcGeneralDevice {
  157. fn as_any_ref(&self) -> &dyn core::any::Any {
  158. self
  159. }
  160. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  161. self.inner().kobject_common.kern_inode = inode;
  162. }
  163. fn inode(&self) -> Option<Arc<KernFSInode>> {
  164. self.inner().kobject_common.kern_inode.clone()
  165. }
  166. fn parent(&self) -> Option<Weak<dyn KObject>> {
  167. self.inner().kobject_common.parent.clone()
  168. }
  169. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  170. self.inner().kobject_common.parent = parent;
  171. }
  172. fn kset(&self) -> Option<Arc<KSet>> {
  173. self.inner().kobject_common.kset.clone()
  174. }
  175. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  176. self.inner().kobject_common.kset = kset;
  177. }
  178. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  179. self.inner().kobject_common.kobj_type
  180. }
  181. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  182. self.inner().kobject_common.kobj_type = ktype;
  183. }
  184. fn name(&self) -> String {
  185. self.name.clone()
  186. }
  187. fn set_name(&self, _name: String) {
  188. // do nothing
  189. }
  190. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  191. self.kobj_state.read()
  192. }
  193. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  194. self.kobj_state.write()
  195. }
  196. fn set_kobj_state(&self, state: KObjectState) {
  197. *self.kobj_state_mut() = state;
  198. }
  199. }
  200. ///
  201. /// 用于创建一个通用的RTC设备实例。
  202. ///
  203. /// ## 参数
  204. ///
  205. /// - `real_dev`: 一个对实际RTC设备的引用,这个设备将作为通用RTC设备的父设备。
  206. pub fn rtc_general_device_create(
  207. real_dev: &Arc<dyn RtcDevice>,
  208. priority: Option<GeneralRtcPriority>,
  209. ) -> Arc<RtcGeneralDevice> {
  210. let dev = RtcGeneralDevice::new(priority.unwrap_or_default());
  211. device_manager().device_default_initialize(&(dev.clone() as Arc<dyn Device>));
  212. dev.set_dev_parent(Some(Arc::downgrade(real_dev) as Weak<dyn Device>));
  213. dev.set_class(Some(Arc::downgrade(
  214. &(sys_class_rtc_instance().cloned().unwrap() as Arc<dyn Class>),
  215. )));
  216. return dev;
  217. }
  218. #[derive(Debug)]
  219. struct RtcAttrGroup;
  220. impl AttributeGroup for RtcAttrGroup {
  221. fn name(&self) -> Option<&str> {
  222. None
  223. }
  224. fn attrs(&self) -> &[&'static dyn Attribute] {
  225. &[&AttrName, &AttrDate, &AttrTime, &AttrHcToSys]
  226. }
  227. fn is_visible(
  228. &self,
  229. _kobj: Arc<dyn KObject>,
  230. attr: &'static dyn Attribute,
  231. ) -> Option<ModeType> {
  232. // todo: https://code.dragonos.org.cn/xref/linux-6.6.21/drivers/rtc/sysfs.c#280
  233. return Some(attr.mode());
  234. }
  235. }
  236. #[derive(Debug)]
  237. struct AttrName;
  238. impl Attribute for AttrName {
  239. fn name(&self) -> &str {
  240. "name"
  241. }
  242. fn mode(&self) -> ModeType {
  243. SYSFS_ATTR_MODE_RO
  244. }
  245. fn support(&self) -> SysFSOpsSupport {
  246. SysFSOpsSupport::ATTR_SHOW
  247. }
  248. fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
  249. let rtc_device = kobj
  250. .parent()
  251. .and_then(|x| x.upgrade())
  252. .ok_or(SystemError::ENODEV)?;
  253. let rtc_device = kobj2rtc_device(rtc_device).ok_or(SystemError::EINVAL)?;
  254. let driver_name = rtc_device.driver().ok_or(SystemError::ENODEV)?.name();
  255. let device_name = rtc_device.name();
  256. sysfs_emit_str(buf, &format!("{} {}\n", driver_name, device_name))
  257. }
  258. }
  259. #[derive(Debug)]
  260. struct AttrDate;
  261. impl Attribute for AttrDate {
  262. fn name(&self) -> &str {
  263. "date"
  264. }
  265. fn mode(&self) -> ModeType {
  266. SYSFS_ATTR_MODE_RO
  267. }
  268. fn support(&self) -> SysFSOpsSupport {
  269. SysFSOpsSupport::ATTR_SHOW
  270. }
  271. fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
  272. let rtc_device: Arc<RtcGeneralDevice> =
  273. kobj2rtc_general_device(kobj).ok_or(SystemError::EINVAL)?;
  274. let time = rtc_read_time(&rtc_device)?;
  275. sysfs_emit_str(buf, &time.date_string())
  276. }
  277. }
  278. #[derive(Debug)]
  279. struct AttrTime;
  280. impl Attribute for AttrTime {
  281. fn name(&self) -> &str {
  282. "time"
  283. }
  284. fn mode(&self) -> ModeType {
  285. SYSFS_ATTR_MODE_RO
  286. }
  287. fn support(&self) -> SysFSOpsSupport {
  288. SysFSOpsSupport::ATTR_SHOW
  289. }
  290. fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
  291. let rtc_device = kobj2rtc_general_device(kobj).ok_or(SystemError::EINVAL)?;
  292. let time = rtc_read_time(&rtc_device)?;
  293. sysfs_emit_str(buf, &time.time_string())
  294. }
  295. }
  296. #[derive(Debug)]
  297. struct AttrHcToSys;
  298. impl Attribute for AttrHcToSys {
  299. fn name(&self) -> &str {
  300. "hctosys"
  301. }
  302. fn mode(&self) -> ModeType {
  303. SYSFS_ATTR_MODE_RO
  304. }
  305. fn support(&self) -> SysFSOpsSupport {
  306. SysFSOpsSupport::ATTR_SHOW
  307. }
  308. fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
  309. let rtc_device = kobj2rtc_general_device(kobj).ok_or(SystemError::EINVAL)?;
  310. if rtc_device.hc2sysfs_result().is_ok() && rtc_device.name().eq(RTC_HCTOSYS_DEVICE) {
  311. return sysfs_emit_str(buf, "1\n");
  312. }
  313. return sysfs_emit_str(buf, "0\n");
  314. }
  315. }