xref: /DragonOS/kernel/src/driver/base/cpu.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
1d7f5742aSLoGin use core::any::Any;
2d7f5742aSLoGin 
3d7f5742aSLoGin use alloc::{
4d7f5742aSLoGin     string::{String, ToString},
5d7f5742aSLoGin     sync::{Arc, Weak},
6d7f5742aSLoGin };
7d7f5742aSLoGin 
8d7f5742aSLoGin use crate::{
9d7f5742aSLoGin     driver::acpi::acpi_manager,
10d7f5742aSLoGin     filesystem::kernfs::KernFSInode,
11d7f5742aSLoGin     libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
12d7f5742aSLoGin };
13d7f5742aSLoGin 
1491e9d4abSLoGin use system_error::SystemError;
1591e9d4abSLoGin 
16d7f5742aSLoGin use super::{
1708a2ee40SLoGin     class::Class,
18d7f5742aSLoGin     device::{
19d7f5742aSLoGin         bus::{subsystem_manager, Bus},
20d7f5742aSLoGin         driver::Driver,
21*28fe4ad2S黄铭涛         Device, DeviceCommonData, DeviceType, IdTable,
22d7f5742aSLoGin     },
23*28fe4ad2S黄铭涛     kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
24d7f5742aSLoGin     kset::KSet,
25d7f5742aSLoGin     subsys::SubSysPrivate,
26d7f5742aSLoGin };
27d7f5742aSLoGin 
28d7f5742aSLoGin #[inline(always)]
cpu_device_manager() -> &'static CpuDeviceManager29d7f5742aSLoGin pub fn cpu_device_manager() -> &'static CpuDeviceManager {
30d7f5742aSLoGin     return &CpuDeviceManager;
31d7f5742aSLoGin }
32d7f5742aSLoGin 
33d7f5742aSLoGin #[derive(Debug)]
34d7f5742aSLoGin pub struct CpuDeviceManager;
35d7f5742aSLoGin 
36d7f5742aSLoGin impl CpuDeviceManager {
37d7f5742aSLoGin     /// 初始化设备驱动模型的CPU子系统
38d7f5742aSLoGin     ///
39e7071df6SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/cpu.c?fi=get_cpu_device#622
init(&self) -> Result<(), SystemError>40d7f5742aSLoGin     pub fn init(&self) -> Result<(), SystemError> {
41d7f5742aSLoGin         let cpu_subsys = CpuSubSystem::new();
42d7f5742aSLoGin         let root_device = CpuSubSystemFakeRootDevice::new();
43d7f5742aSLoGin         subsystem_manager()
44d7f5742aSLoGin             .subsys_system_register(
45d7f5742aSLoGin                 &(cpu_subsys as Arc<dyn Bus>),
46d7f5742aSLoGin                 &(root_device as Arc<dyn Device>),
47d7f5742aSLoGin             )
48d7f5742aSLoGin             .expect("register cpu subsys failed");
49d7f5742aSLoGin 
50d7f5742aSLoGin         return Ok(());
51d7f5742aSLoGin     }
52d7f5742aSLoGin }
53d7f5742aSLoGin 
54d7f5742aSLoGin /// cpu子系统
55d7f5742aSLoGin ///
56e7071df6SLoGin /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/cpu.c?fi=get_cpu_device#128
57d7f5742aSLoGin #[derive(Debug)]
58d7f5742aSLoGin struct CpuSubSystem {
59d7f5742aSLoGin     subsys_private: SubSysPrivate,
60d7f5742aSLoGin }
61d7f5742aSLoGin 
62d7f5742aSLoGin impl CpuSubSystem {
new() -> Arc<Self>63d7f5742aSLoGin     pub fn new() -> Arc<Self> {
64d7f5742aSLoGin         let bus = Arc::new(Self {
6508a2ee40SLoGin             subsys_private: SubSysPrivate::new("cpu".to_string(), None, None, &[]),
66d7f5742aSLoGin         });
67d7f5742aSLoGin         bus.subsystem()
6808a2ee40SLoGin             .set_bus(Some(Arc::downgrade(&(bus.clone() as Arc<dyn Bus>))));
69d7f5742aSLoGin         return bus;
70d7f5742aSLoGin     }
71d7f5742aSLoGin }
72d7f5742aSLoGin 
73d7f5742aSLoGin impl Bus for CpuSubSystem {
name(&self) -> String74d7f5742aSLoGin     fn name(&self) -> String {
75d7f5742aSLoGin         "cpu".to_string()
76d7f5742aSLoGin     }
77d7f5742aSLoGin 
dev_name(&self) -> String78d7f5742aSLoGin     fn dev_name(&self) -> String {
79d7f5742aSLoGin         self.name()
80d7f5742aSLoGin     }
81d7f5742aSLoGin 
remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>82d7f5742aSLoGin     fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
83d7f5742aSLoGin         todo!()
84d7f5742aSLoGin     }
85d7f5742aSLoGin 
shutdown(&self, _device: &Arc<dyn Device>)86d7f5742aSLoGin     fn shutdown(&self, _device: &Arc<dyn Device>) {
87d7f5742aSLoGin         todo!()
88d7f5742aSLoGin     }
89d7f5742aSLoGin 
resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>90d7f5742aSLoGin     fn resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
91d7f5742aSLoGin         todo!()
92d7f5742aSLoGin     }
93d7f5742aSLoGin 
match_device( &self, device: &Arc<dyn Device>, driver: &Arc<dyn Driver>, ) -> Result<bool, SystemError>94d7f5742aSLoGin     fn match_device(
95d7f5742aSLoGin         &self,
96d7f5742aSLoGin         device: &Arc<dyn Device>,
97d7f5742aSLoGin         driver: &Arc<dyn Driver>,
98d7f5742aSLoGin     ) -> Result<bool, SystemError> {
99d7f5742aSLoGin         // ACPI style match is the only one that may succeed.
100d7f5742aSLoGin         return acpi_manager().driver_match_device(driver, device);
101d7f5742aSLoGin     }
102d7f5742aSLoGin 
subsystem(&self) -> &SubSysPrivate103d7f5742aSLoGin     fn subsystem(&self) -> &SubSysPrivate {
104d7f5742aSLoGin         &self.subsys_private
105d7f5742aSLoGin     }
106d7f5742aSLoGin }
107d7f5742aSLoGin 
108d7f5742aSLoGin #[derive(Debug)]
109d7f5742aSLoGin #[cast_to([sync] Device)]
110d7f5742aSLoGin pub struct CpuSubSystemFakeRootDevice {
111d7f5742aSLoGin     inner: RwLock<InnerCpuSubSystemFakeRootDevice>,
112d7f5742aSLoGin     kobj_state: LockedKObjectState,
113d7f5742aSLoGin }
114d7f5742aSLoGin 
115d7f5742aSLoGin impl CpuSubSystemFakeRootDevice {
new() -> Arc<Self>116d7f5742aSLoGin     pub fn new() -> Arc<Self> {
117d7f5742aSLoGin         return Arc::new(Self {
118d7f5742aSLoGin             inner: RwLock::new(InnerCpuSubSystemFakeRootDevice::new()),
119d7f5742aSLoGin             kobj_state: LockedKObjectState::new(None),
120d7f5742aSLoGin         });
121d7f5742aSLoGin     }
122d7f5742aSLoGin }
123d7f5742aSLoGin 
124d7f5742aSLoGin #[derive(Debug)]
125d7f5742aSLoGin struct InnerCpuSubSystemFakeRootDevice {
126*28fe4ad2S黄铭涛     kobject_common: KObjectCommonData,
127*28fe4ad2S黄铭涛     device_common: DeviceCommonData,
128d7f5742aSLoGin     name: String,
129d7f5742aSLoGin }
130d7f5742aSLoGin 
131d7f5742aSLoGin impl InnerCpuSubSystemFakeRootDevice {
new() -> Self132d7f5742aSLoGin     pub fn new() -> Self {
133d7f5742aSLoGin         return Self {
134*28fe4ad2S黄铭涛             kobject_common: KObjectCommonData::default(),
135*28fe4ad2S黄铭涛             device_common: DeviceCommonData::default(),
136d7f5742aSLoGin             name: "".to_string(),
137d7f5742aSLoGin         };
138d7f5742aSLoGin     }
139d7f5742aSLoGin }
140d7f5742aSLoGin 
141d7f5742aSLoGin impl Device for CpuSubSystemFakeRootDevice {
dev_type(&self) -> DeviceType142d7f5742aSLoGin     fn dev_type(&self) -> DeviceType {
143d7f5742aSLoGin         todo!()
144d7f5742aSLoGin     }
145d7f5742aSLoGin 
id_table(&self) -> IdTable146d7f5742aSLoGin     fn id_table(&self) -> IdTable {
147c566df45SLoGin         IdTable::new("cpu".to_string(), None)
148d7f5742aSLoGin     }
149d7f5742aSLoGin 
set_bus(&self, bus: Option<Weak<dyn Bus>>)150c566df45SLoGin     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
151*28fe4ad2S黄铭涛         self.inner.write().device_common.bus = bus;
152d7f5742aSLoGin     }
153d7f5742aSLoGin 
bus(&self) -> Option<Weak<dyn Bus>>154c566df45SLoGin     fn bus(&self) -> Option<Weak<dyn Bus>> {
155*28fe4ad2S黄铭涛         self.inner.read().device_common.bus.clone()
156c566df45SLoGin     }
157c566df45SLoGin 
driver(&self) -> Option<Arc<dyn Driver>>158d7f5742aSLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
159d7f5742aSLoGin         None
160d7f5742aSLoGin     }
161d7f5742aSLoGin 
set_driver(&self, _driver: Option<Weak<dyn Driver>>)162d7f5742aSLoGin     fn set_driver(&self, _driver: Option<Weak<dyn Driver>>) {
163d7f5742aSLoGin         todo!()
164d7f5742aSLoGin     }
165d7f5742aSLoGin 
is_dead(&self) -> bool166d7f5742aSLoGin     fn is_dead(&self) -> bool {
167d7f5742aSLoGin         false
168d7f5742aSLoGin     }
169d7f5742aSLoGin 
can_match(&self) -> bool170d7f5742aSLoGin     fn can_match(&self) -> bool {
171d7f5742aSLoGin         todo!()
172d7f5742aSLoGin     }
173d7f5742aSLoGin 
set_can_match(&self, _can_match: bool)174d7f5742aSLoGin     fn set_can_match(&self, _can_match: bool) {
175d7f5742aSLoGin         todo!()
176d7f5742aSLoGin     }
177d7f5742aSLoGin 
state_synced(&self) -> bool178d7f5742aSLoGin     fn state_synced(&self) -> bool {
179d7f5742aSLoGin         true
180d7f5742aSLoGin     }
18108a2ee40SLoGin 
set_class(&self, _class: Option<Weak<dyn Class>>)1824256da7fSLoGin     fn set_class(&self, _class: Option<Weak<dyn Class>>) {
18308a2ee40SLoGin         todo!()
18408a2ee40SLoGin     }
185*28fe4ad2S黄铭涛 
dev_parent(&self) -> Option<Weak<dyn Device>>186*28fe4ad2S黄铭涛     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
187*28fe4ad2S黄铭涛         self.inner.read().device_common.parent.clone()
188*28fe4ad2S黄铭涛     }
189*28fe4ad2S黄铭涛 
set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>)190*28fe4ad2S黄铭涛     fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
191*28fe4ad2S黄铭涛         self.inner.write().device_common.parent = dev_parent;
192*28fe4ad2S黄铭涛     }
193d7f5742aSLoGin }
194d7f5742aSLoGin 
195d7f5742aSLoGin impl KObject for CpuSubSystemFakeRootDevice {
as_any_ref(&self) -> &dyn Any196d7f5742aSLoGin     fn as_any_ref(&self) -> &dyn Any {
197d7f5742aSLoGin         self
198d7f5742aSLoGin     }
199d7f5742aSLoGin 
set_inode(&self, inode: Option<Arc<KernFSInode>>)200d7f5742aSLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
201*28fe4ad2S黄铭涛         self.inner.write().kobject_common.kern_inode = inode;
202d7f5742aSLoGin     }
203d7f5742aSLoGin 
inode(&self) -> Option<Arc<KernFSInode>>204d7f5742aSLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
205*28fe4ad2S黄铭涛         self.inner.read().kobject_common.kern_inode.clone()
206d7f5742aSLoGin     }
207d7f5742aSLoGin 
parent(&self) -> Option<Weak<dyn KObject>>208d7f5742aSLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
209*28fe4ad2S黄铭涛         self.inner.read().kobject_common.parent.clone()
210d7f5742aSLoGin     }
211d7f5742aSLoGin 
set_parent(&self, parent: Option<Weak<dyn KObject>>)212d7f5742aSLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
213*28fe4ad2S黄铭涛         self.inner.write().kobject_common.parent = parent;
214d7f5742aSLoGin     }
215d7f5742aSLoGin 
kset(&self) -> Option<Arc<KSet>>216d7f5742aSLoGin     fn kset(&self) -> Option<Arc<KSet>> {
217*28fe4ad2S黄铭涛         self.inner.read().kobject_common.kset.clone()
218d7f5742aSLoGin     }
219d7f5742aSLoGin 
set_kset(&self, kset: Option<Arc<KSet>>)220d7f5742aSLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
221*28fe4ad2S黄铭涛         self.inner.write().kobject_common.kset = kset;
222d7f5742aSLoGin     }
223d7f5742aSLoGin 
kobj_type(&self) -> Option<&'static dyn KObjType>224d7f5742aSLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
225*28fe4ad2S黄铭涛         self.inner.read().kobject_common.kobj_type
226d7f5742aSLoGin     }
227d7f5742aSLoGin 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)228d7f5742aSLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
229*28fe4ad2S黄铭涛         self.inner.write().kobject_common.kobj_type = ktype;
230d7f5742aSLoGin     }
231d7f5742aSLoGin 
name(&self) -> String232d7f5742aSLoGin     fn name(&self) -> String {
233d7f5742aSLoGin         self.inner.read().name.clone()
234d7f5742aSLoGin     }
235d7f5742aSLoGin 
set_name(&self, name: String)236d7f5742aSLoGin     fn set_name(&self, name: String) {
237d7f5742aSLoGin         self.inner.write().name = name;
238d7f5742aSLoGin     }
239d7f5742aSLoGin 
kobj_state(&self) -> RwLockReadGuard<KObjectState>240d7f5742aSLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
241d7f5742aSLoGin         self.kobj_state.read()
242d7f5742aSLoGin     }
243d7f5742aSLoGin 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>244d7f5742aSLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
245d7f5742aSLoGin         self.kobj_state.write()
246d7f5742aSLoGin     }
247d7f5742aSLoGin 
set_kobj_state(&self, state: KObjectState)248d7f5742aSLoGin     fn set_kobj_state(&self, state: KObjectState) {
249d7f5742aSLoGin         *self.kobj_state_mut() = state;
250d7f5742aSLoGin     }
251d7f5742aSLoGin }
252