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