xref: /DragonOS/kernel/src/driver/base/platform/platform_device.rs (revision 06d5e247267cb65b84a80f219853ccd0f384b16e)
1*06d5e247SLoGin use alloc::{
2*06d5e247SLoGin     string::{String, ToString},
3*06d5e247SLoGin     sync::{Arc, Weak},
4*06d5e247SLoGin };
5*06d5e247SLoGin 
6*06d5e247SLoGin use crate::{
7*06d5e247SLoGin     driver::{
8*06d5e247SLoGin         base::{
9*06d5e247SLoGin             device::{
10*06d5e247SLoGin                 bus::{Bus, BusState},
11*06d5e247SLoGin                 Device, DeviceNumber, DevicePrivateData, DeviceType, IdTable,
12*06d5e247SLoGin             },
13*06d5e247SLoGin             kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
14*06d5e247SLoGin             kset::KSet,
15*06d5e247SLoGin         },
16*06d5e247SLoGin         Driver,
17*06d5e247SLoGin     },
18*06d5e247SLoGin     filesystem::kernfs::KernFSInode,
19*06d5e247SLoGin     libs::{
20*06d5e247SLoGin         rwlock::{RwLockReadGuard, RwLockWriteGuard},
21*06d5e247SLoGin         spinlock::SpinLock,
22*06d5e247SLoGin     },
23*06d5e247SLoGin };
24b087521eSChiichen 
25b087521eSChiichen use super::{super::device::DeviceState, CompatibleTable};
262a7d773dSTingHuang 
272a7d773dSTingHuang /// @brief: 实现该trait的设备实例应挂载在platform总线上,
282a7d773dSTingHuang ///         同时应该实现Device trait
292a7d773dSTingHuang pub trait PlatformDevice: Device {
300663027bSTingHuang     fn compatible_table(&self) -> CompatibleTable;
312a7d773dSTingHuang     /// @brief: 判断设备是否初始化
322a7d773dSTingHuang     /// @parameter: None
332a7d773dSTingHuang     /// @return: 如果已经初始化,返回true,否则,返回false
342a7d773dSTingHuang     fn is_initialized(&self) -> bool;
352a7d773dSTingHuang 
362a7d773dSTingHuang     /// @brief: 设置设备状态
372a7d773dSTingHuang     /// @parameter set_state: 设备状态
382a7d773dSTingHuang     /// @return: None
392a7d773dSTingHuang     fn set_state(&self, set_state: DeviceState);
402a7d773dSTingHuang }
41*06d5e247SLoGin 
42*06d5e247SLoGin #[derive(Debug)]
43*06d5e247SLoGin #[cast_to([sync] Device)]
44*06d5e247SLoGin pub struct PlatformBusDevice {
45*06d5e247SLoGin     inner: SpinLock<InnerPlatformBusDevice>,
46*06d5e247SLoGin     kobj_state: LockedKObjectState,
47*06d5e247SLoGin }
48*06d5e247SLoGin 
49*06d5e247SLoGin impl PlatformBusDevice {
50*06d5e247SLoGin     /// @brief: 创建一个加锁的platform总线实例
51*06d5e247SLoGin     /// @parameter: None
52*06d5e247SLoGin     /// @return: platform总线实例
53*06d5e247SLoGin     pub fn new(
54*06d5e247SLoGin         data: DevicePrivateData,
55*06d5e247SLoGin         parent: Option<Weak<dyn KObject>>,
56*06d5e247SLoGin     ) -> Arc<PlatformBusDevice> {
57*06d5e247SLoGin         return Arc::new(PlatformBusDevice {
58*06d5e247SLoGin             inner: SpinLock::new(InnerPlatformBusDevice::new(data, parent)),
59*06d5e247SLoGin             kobj_state: LockedKObjectState::new(KObjectState::empty()),
60*06d5e247SLoGin         });
61*06d5e247SLoGin     }
62*06d5e247SLoGin 
63*06d5e247SLoGin     /// @brief: 获取总线的匹配表
64*06d5e247SLoGin     /// @parameter: None
65*06d5e247SLoGin     /// @return: platform总线匹配表
66*06d5e247SLoGin     #[inline]
67*06d5e247SLoGin     #[allow(dead_code)]
68*06d5e247SLoGin     fn compatible_table(&self) -> CompatibleTable {
69*06d5e247SLoGin         CompatibleTable::new(vec!["platform"])
70*06d5e247SLoGin     }
71*06d5e247SLoGin 
72*06d5e247SLoGin     /// @brief: 判断总线是否初始化
73*06d5e247SLoGin     /// @parameter: None
74*06d5e247SLoGin     /// @return: 已初始化,返回true,否则,返回false
75*06d5e247SLoGin     #[inline]
76*06d5e247SLoGin     #[allow(dead_code)]
77*06d5e247SLoGin     fn is_initialized(&self) -> bool {
78*06d5e247SLoGin         let state = self.inner.lock().state;
79*06d5e247SLoGin         match state {
80*06d5e247SLoGin             BusState::Initialized => true,
81*06d5e247SLoGin             _ => false,
82*06d5e247SLoGin         }
83*06d5e247SLoGin     }
84*06d5e247SLoGin 
85*06d5e247SLoGin     /// @brief: 设置总线状态
86*06d5e247SLoGin     /// @parameter set_state: 总线状态BusState
87*06d5e247SLoGin     /// @return: None
88*06d5e247SLoGin     #[inline]
89*06d5e247SLoGin     #[allow(dead_code)]
90*06d5e247SLoGin     fn set_state(&self, set_state: BusState) {
91*06d5e247SLoGin         let state = &mut self.inner.lock().state;
92*06d5e247SLoGin         *state = set_state;
93*06d5e247SLoGin     }
94*06d5e247SLoGin 
95*06d5e247SLoGin     /// @brief: 获取总线状态
96*06d5e247SLoGin     /// @parameter: None
97*06d5e247SLoGin     /// @return: 总线状态
98*06d5e247SLoGin     #[inline]
99*06d5e247SLoGin     #[allow(dead_code)]
100*06d5e247SLoGin     fn get_state(&self) -> BusState {
101*06d5e247SLoGin         let state = self.inner.lock().state;
102*06d5e247SLoGin         return state;
103*06d5e247SLoGin     }
104*06d5e247SLoGin 
105*06d5e247SLoGin     // /// @brief:
106*06d5e247SLoGin     // /// @parameter: None
107*06d5e247SLoGin     // /// @return: 总线状态
108*06d5e247SLoGin     // #[inline]
109*06d5e247SLoGin     // #[allow(dead_code)]
110*06d5e247SLoGin     // fn set_driver(&self, driver: Option<Arc<LockedPlatformBusDriver>>) {
111*06d5e247SLoGin     //     self.0.lock().driver = driver;
112*06d5e247SLoGin     // }
113*06d5e247SLoGin }
114*06d5e247SLoGin 
115*06d5e247SLoGin /// @brief: platform总线
116*06d5e247SLoGin #[allow(dead_code)]
117*06d5e247SLoGin #[derive(Debug, Clone)]
118*06d5e247SLoGin pub struct InnerPlatformBusDevice {
119*06d5e247SLoGin     name: String,
120*06d5e247SLoGin     data: DevicePrivateData,
121*06d5e247SLoGin     state: BusState,                   // 总线状态
122*06d5e247SLoGin     parent: Option<Weak<dyn KObject>>, // 总线的父对象
123*06d5e247SLoGin 
124*06d5e247SLoGin     kernfs_inode: Option<Arc<KernFSInode>>,
125*06d5e247SLoGin     /// 当前设备挂载到的总线
126*06d5e247SLoGin     bus: Option<Arc<dyn Bus>>,
127*06d5e247SLoGin     /// 当前设备已经匹配的驱动
128*06d5e247SLoGin     driver: Option<Arc<dyn Driver>>,
129*06d5e247SLoGin }
130*06d5e247SLoGin 
131*06d5e247SLoGin /// @brief: platform方法集
132*06d5e247SLoGin impl InnerPlatformBusDevice {
133*06d5e247SLoGin     /// @brief: 创建一个platform总线实例
134*06d5e247SLoGin     /// @parameter: None
135*06d5e247SLoGin     /// @return: platform总线实例
136*06d5e247SLoGin     pub fn new(data: DevicePrivateData, parent: Option<Weak<dyn KObject>>) -> Self {
137*06d5e247SLoGin         Self {
138*06d5e247SLoGin             data,
139*06d5e247SLoGin             name: "platform".to_string(),
140*06d5e247SLoGin             state: BusState::NotInitialized,
141*06d5e247SLoGin             parent,
142*06d5e247SLoGin             kernfs_inode: None,
143*06d5e247SLoGin             bus: None,
144*06d5e247SLoGin             driver: None,
145*06d5e247SLoGin         }
146*06d5e247SLoGin     }
147*06d5e247SLoGin }
148*06d5e247SLoGin 
149*06d5e247SLoGin impl KObject for PlatformBusDevice {
150*06d5e247SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
151*06d5e247SLoGin         self
152*06d5e247SLoGin     }
153*06d5e247SLoGin 
154*06d5e247SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
155*06d5e247SLoGin         self.inner.lock().parent.clone()
156*06d5e247SLoGin     }
157*06d5e247SLoGin 
158*06d5e247SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
159*06d5e247SLoGin         self.inner.lock().kernfs_inode.clone()
160*06d5e247SLoGin     }
161*06d5e247SLoGin 
162*06d5e247SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
163*06d5e247SLoGin         self.inner.lock().kernfs_inode = inode;
164*06d5e247SLoGin     }
165*06d5e247SLoGin 
166*06d5e247SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
167*06d5e247SLoGin         None
168*06d5e247SLoGin     }
169*06d5e247SLoGin 
170*06d5e247SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
171*06d5e247SLoGin         None
172*06d5e247SLoGin     }
173*06d5e247SLoGin 
174*06d5e247SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
175*06d5e247SLoGin         self.kobj_state.read()
176*06d5e247SLoGin     }
177*06d5e247SLoGin 
178*06d5e247SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
179*06d5e247SLoGin         self.kobj_state.write()
180*06d5e247SLoGin     }
181*06d5e247SLoGin 
182*06d5e247SLoGin     fn set_kobj_state(&self, state: KObjectState) {
183*06d5e247SLoGin         *self.kobj_state.write() = state;
184*06d5e247SLoGin     }
185*06d5e247SLoGin 
186*06d5e247SLoGin     fn name(&self) -> String {
187*06d5e247SLoGin         self.inner.lock().name.clone()
188*06d5e247SLoGin     }
189*06d5e247SLoGin 
190*06d5e247SLoGin     fn set_name(&self, name: String) {
191*06d5e247SLoGin         self.inner.lock().name = name;
192*06d5e247SLoGin     }
193*06d5e247SLoGin 
194*06d5e247SLoGin     fn set_kset(&self, _kset: Option<Arc<KSet>>) {
195*06d5e247SLoGin         todo!()
196*06d5e247SLoGin     }
197*06d5e247SLoGin 
198*06d5e247SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
199*06d5e247SLoGin         self.inner.lock().parent = parent;
200*06d5e247SLoGin     }
201*06d5e247SLoGin }
202*06d5e247SLoGin 
203*06d5e247SLoGin /// @brief: 为Platform实现Device trait,platform总线也是一种设备,属于总线设备类型
204*06d5e247SLoGin impl Device for PlatformBusDevice {
205*06d5e247SLoGin     #[inline]
206*06d5e247SLoGin     #[allow(dead_code)]
207*06d5e247SLoGin     fn dev_type(&self) -> DeviceType {
208*06d5e247SLoGin         return DeviceType::Bus;
209*06d5e247SLoGin     }
210*06d5e247SLoGin 
211*06d5e247SLoGin     #[inline]
212*06d5e247SLoGin     #[allow(dead_code)]
213*06d5e247SLoGin     fn id_table(&self) -> IdTable {
214*06d5e247SLoGin         IdTable::new("platform".to_string(), DeviceNumber::new(0))
215*06d5e247SLoGin     }
216*06d5e247SLoGin 
217*06d5e247SLoGin     fn bus(&self) -> Option<Arc<dyn Bus>> {
218*06d5e247SLoGin         self.inner.lock().bus.clone()
219*06d5e247SLoGin     }
220*06d5e247SLoGin 
221*06d5e247SLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
222*06d5e247SLoGin         self.inner.lock().driver.clone()
223*06d5e247SLoGin     }
224*06d5e247SLoGin 
225*06d5e247SLoGin     #[inline]
226*06d5e247SLoGin     fn is_dead(&self) -> bool {
227*06d5e247SLoGin         false
228*06d5e247SLoGin     }
229*06d5e247SLoGin 
230*06d5e247SLoGin     fn set_driver(&self, driver: Option<Arc<dyn Driver>>) {
231*06d5e247SLoGin         self.inner.lock().driver = driver;
232*06d5e247SLoGin     }
233*06d5e247SLoGin }
234