1extern crate alloc;
44
45use alloc::collections::btree_map::BTreeMap;
46use alloc::sync::Arc;
47use alloc::vec::Vec;
48use alloc::boxed::Box;
49use spin::mutex::Mutex;
50use spin::rwlock::RwLock;
51
52use crate::device::platform::resource::PlatformDeviceResource;
53use crate::device::platform::resource::PlatformDeviceResourceType;
54use crate::device::platform::PlatformDeviceInfo;
55use crate::println;
56
57use crate::traits::serial::Serial;
58
59use super::fdt::FdtManager;
60use super::Device;
61use super::DeviceDriver;
62use super::DeviceInfo;
63use super::DeviceType;
64
65pub struct BasicDeviceManager {
75 serials: Vec<Box<dyn Serial>>,
77}
78
79impl BasicDeviceManager {
80 pub fn register_serial(&mut self, serial: Box<dyn Serial>) {
81 self.serials.push(serial);
82 println!("Registered serial device");
83 }
84
85 pub fn register_serials(&mut self, serias: Vec<Box<dyn Serial>>) {
86 let len = serias.len();
87 for serial in serias {
88 self.serials.push(serial);
89 }
90 println!("Registered serial devices: {}", len);
91 }
92
93 pub fn borrow_serial(&self, idx: usize) -> Option<&Box<dyn Serial>> {
94 self.serials.get(idx)
95 }
96
97 pub fn borrow_mut_serial(&mut self, idx: usize) -> Option<&mut Box<dyn Serial>> {
98 self.serials.get_mut(idx)
99 }
100
101 pub fn borrow_serials(&self) -> &Vec<Box<dyn Serial>> {
102 &self.serials
103 }
104
105 pub fn borrow_mut_serials(&mut self) -> &mut Vec<Box<dyn Serial>> {
106 &mut self.serials
107 }
108}
109
110#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
111pub enum DeviceState {
112 Available,
113 InUse,
114 InUseExclusive,
115}
116
117pub struct DeviceHandle {
118 device: Arc<RwLock<Box<dyn Device>>>,
119 state: RwLock<DeviceState>,
120 borrow_count: RwLock<usize>,
121}
122
123impl DeviceHandle {
124 pub fn new(device: Arc<RwLock<Box<dyn Device>>>) -> Self {
125 Self {
126 device,
127 state: RwLock::new(DeviceState::Available),
128 borrow_count: RwLock::new(0),
129 }
130 }
131
132 pub fn is_in_use(&self) -> bool {
133 *self.state.read() == DeviceState::InUse || *self.state.read() == DeviceState::InUseExclusive
134 }
135
136 pub fn is_in_use_exclusive(&self) -> bool {
137 *self.state.read() == DeviceState::InUseExclusive
138 }
139
140 fn set_in_use(&self) {
141 let mut state = self.state.write();
142 *state = DeviceState::InUse;
143 }
144
145 fn set_available(&self) {
146 let mut state = self.state.write();
147 *state = DeviceState::Available;
148 }
149
150 fn set_in_use_exclusive(&self) {
151 let mut state = self.state.write();
152 *state = DeviceState::InUseExclusive;
153 }
154
155 fn increment_borrow_count(&self) {
156 let mut count = self.borrow_count.write();
157 *count += 1;
158 }
159
160 fn decrement_borrow_count(&self) {
161 let mut count = self.borrow_count.write();
162 if *count > 0 {
163 *count -= 1;
164 }
165 }
166
167 pub fn get_borrow_count(&self) -> usize {
168 *self.borrow_count.read()
169 }
170}
171
172pub type BorrowedDevice = Arc<RwLock<Box<dyn Device>>>;
173
174pub struct BorrowedDeviceGuard {
175 handle: Arc<DeviceHandle>,
176}
177
178impl BorrowedDeviceGuard {
179 pub fn new(handle: Arc<DeviceHandle>) -> Self {
180 Self { handle }
181 }
182}
183
184impl BorrowedDeviceGuard {
185 pub fn device(&self) -> BorrowedDevice {
186 Arc::clone(&self.handle.device)
187 }
188}
189
190impl Drop for BorrowedDeviceGuard {
191 fn drop(&mut self) {
192 self.handle.decrement_borrow_count();
193 if self.handle.get_borrow_count() == 0 {
194 if self.handle.is_in_use_exclusive() {
195 self.handle.set_available();
196 } else {
197 self.handle.set_available();
198 }
199 }
200 }
201}
202
203static mut MANAGER: DeviceManager = DeviceManager::new();
204
205pub struct DeviceManager {
217 pub basic: BasicDeviceManager,
219 devices: Mutex<Vec<Arc<DeviceHandle>>>,
221 drivers: Mutex<Vec<Box<dyn DeviceDriver>>>,
223}
224
225impl DeviceManager {
226 const fn new() -> Self {
227 DeviceManager {
228 basic: BasicDeviceManager {
229 serials: Vec::new(),
230 },
231 devices: Mutex::new(Vec::new()),
232 drivers: Mutex::new(Vec::new()),
233 }
234 }
235
236 #[allow(static_mut_refs)]
237 pub fn get_manager() -> &'static DeviceManager {
238 unsafe { &MANAGER }
239 }
240
241 #[allow(static_mut_refs)]
242 pub fn get_mut_manager() -> &'static mut DeviceManager {
243 unsafe { &mut MANAGER }
244 }
245
246 pub fn register_device(&self, device: Box<dyn Device>) -> usize {
262 let mut devices = self.devices.lock();
263 let device = Arc::new(RwLock::new(device));
264 let handle = DeviceHandle::new(device).into();
265 let id = devices.len();
266 devices.push(handle);
267 id
268 }
269
270 pub fn borrow_device(&self, id: usize) -> Result<BorrowedDeviceGuard, &'static str> {
281 let devices = self.devices.lock();
282 if id < devices.len() {
283 let device = &devices[id];
284 if device.is_in_use_exclusive() {
285 return Err("Device is already in use exclusively");
286 }
287 device.increment_borrow_count(); device.set_in_use(); return Ok(BorrowedDeviceGuard::new(Arc::clone(device)));
290 } else {
291 return Err("Index out of bounds");
292 }
293 }
294
295 pub fn borrow_exclusive_device(&self, id: usize) -> Result<BorrowedDeviceGuard, &'static str> {
306 let devices = self.devices.lock();
307 if id < devices.len() {
308 let handle = &devices[id];
309 if handle.is_in_use() {
310 return Err("Device is already in use");
311 }
312 handle.increment_borrow_count(); handle.set_in_use_exclusive(); return Ok(BorrowedDeviceGuard::new(Arc::clone(handle)));
315 } else {
316 return Err("Index out of bounds");
317 }
318 }
319
320
321
322
323 pub fn get_devices_count(&self) -> usize {
330 let devices = self.devices.lock();
331 devices.len()
332 }
333
334 pub fn borrow_drivers(&self) -> &Mutex<Vec<Box<dyn DeviceDriver>>> {
335 &self.drivers
336 }
337
338 pub fn populate_devices(&mut self) {
345 let fdt_manager = unsafe { FdtManager::get_mut_manager() };
346 let fdt = fdt_manager.get_fdt();
347 if fdt.is_none() {
348 println!("FDT not initialized");
349 return;
350 }
351 let fdt = fdt.unwrap();
352 println!("Populating devices from FDT...");
353
354 let soc = fdt.find_node("/soc");
355 if soc.is_none() {
356 println!("No /soc node found");
357 return;
358 }
359
360 let soc = soc.unwrap();
361 let mut idx = 0;
362 for child in soc.children() {
363 let compatible = child.compatible();
364 if compatible.is_none() {
365 continue;
366 }
367 let compatible = compatible.unwrap().all().collect::<Vec<_>>();
368
369 for driver in self.drivers.lock().iter() {
370 if driver.match_table().iter().any(|&c| compatible.contains(&c)) {
371 let mut resources = Vec::new();
372
373 if let Some(regions) = child.reg() {
375 for region in regions {
376 let res = PlatformDeviceResource {
377 res_type: PlatformDeviceResourceType::MEM,
378 start: region.starting_address as usize,
379 end: region.starting_address as usize + region.size.unwrap() - 1,
380 };
381 resources.push(res);
382 }
383 }
384
385 if let Some(irqs) = child.interrupts() {
387 for irq in irqs {
388 let res = PlatformDeviceResource {
389 res_type: PlatformDeviceResourceType::IRQ,
390 start: irq,
391 end: irq,
392 };
393 resources.push(res);
394 }
395 }
396
397 let device: Box<dyn DeviceInfo> = Box::new(PlatformDeviceInfo::new(
398 child.name,
399 idx,
400 compatible.clone(),
401 resources,
402 ));
403 if let Err(e) = driver.probe(&*device) {
404 println!("Failed to probe device {}: {}", device.name(), e);
405 } else {
406 idx += 1;
407 }
408 }
409 }
410 }
411 }
412
413 pub fn register_driver(&mut self, driver: Box<dyn DeviceDriver>) {
429 self.drivers.lock().push(driver);
430 }
431}
432
433pub fn register_serial(serial: Box<dyn Serial>) {
449 let manager = DeviceManager::get_mut_manager();
450 manager.basic.register_serial(serial);
451}
452
453#[cfg(test)]
454mod tests {
455 use alloc::vec;
456 use super::*;
457 use crate::device::{platform::*, GenericDevice};
458
459 #[test_case]
460 fn test_populate_driver() {
461 static mut TEST_RESULT: bool = false;
462 fn probe_fn(_device: &PlatformDeviceInfo) -> Result<(), &'static str> {
463 unsafe {
464 TEST_RESULT = true;
465 }
466 Ok(())
467 }
468
469 let driver = Box::new(PlatformDeviceDriver::new(
470 "test",
471 probe_fn,
472 |_device| Ok(()),
473 vec!["sifive,test0"]
474 ));
475 DeviceManager::get_mut_manager().register_driver(driver);
476
477 DeviceManager::get_mut_manager().populate_devices();
478 let result = unsafe { TEST_RESULT };
479 assert_eq!(result, true);
480 }
481
482 #[test_case]
483 fn test_borrow_device_from_manager() {
484 let device = Box::new(GenericDevice::new(
485 "test",
486 1,
487 ));
488 let manager = DeviceManager::get_mut_manager();
489 let id = manager.register_device(device);
490 let borrowed_device = manager.borrow_device(id);
491 assert!(borrowed_device.is_ok());
492 let borrowed_device = borrowed_device.unwrap();
493 let device = borrowed_device.device();
494 assert_eq!(device.read().name(), "test");
495 }
496
497 #[test_case]
498 fn test_borrow_exclusive_device_from_manager() {
499 let device = Box::new(GenericDevice::new(
500 "test",
501 1,
502 ));
503 let manager = DeviceManager::get_mut_manager();
504 let id = manager.register_device(device);
505 let borrowed_device = manager.borrow_exclusive_device(id);
506 assert!(borrowed_device.is_ok());
507 let borrowed_device = borrowed_device.unwrap();
508 let device = borrowed_device.device();
509 assert_eq!(device.read().name(), "test");
510 }
511
512 #[test_case]
513 fn test_borrow_exclusive_device_from_manager_fail() {
514 let device = Box::new(GenericDevice::new(
515 "test",
516 1,
517 ));
518 let manager = DeviceManager::get_mut_manager();
519 let id = manager.register_device(device);
520 let borrowed_device = manager.borrow_exclusive_device(id);
521 assert!(borrowed_device.is_ok());
522 let borrowed_device = borrowed_device.unwrap();
523 let device = borrowed_device.device();
524 assert_eq!(device.read().name(), "test");
525 let borrowed_device2 = manager.borrow_exclusive_device(id);
526 assert!(borrowed_device2.is_err());
527 }
528
529 #[test_case]
530 fn test_drop_borrowed_device() {
531 let device = Box::new(GenericDevice::new(
532 "test",
533 1,
534 ));
535 let manager = DeviceManager::get_mut_manager();
536 let id = manager.register_device(device);
537 {
538 let borrowed_device = manager.borrow_device(id);
539 assert!(borrowed_device.is_ok());
540 let borrowed_device = borrowed_device.unwrap();
541 let device = borrowed_device.device();
542 assert_eq!(device.read().name(), "test");
543 assert!(borrowed_device.handle.is_in_use());
545 assert_eq!(borrowed_device.handle.get_borrow_count(), 1);
546 }
547 let borrowed_device = manager.borrow_exclusive_device(id);
549 assert!(borrowed_device.is_ok());
550 }
551
552 #[test_case]
553 fn test_drop_multiple_borrowed_device() {
554 let device = Box::new(GenericDevice::new(
555 "test",
556 1,
557 ));
558 let manager = DeviceManager::get_mut_manager();
559 let id = manager.register_device(device);
560 {
561 let borrowed_device = manager.borrow_device(id);
562 assert!(borrowed_device.is_ok());
563 let borrowed_device = borrowed_device.unwrap();
564 let device = borrowed_device.device();
565 assert_eq!(device.read().name(), "test");
566 assert!(borrowed_device.handle.is_in_use());
568 assert_eq!(borrowed_device.handle.get_borrow_count(), 1);
569
570 {
571 let borrowed_device = manager.borrow_device(id).unwrap();
573 let device = borrowed_device.device();
574 assert_eq!(device.read().name(), "test");
575 assert!(borrowed_device.handle.is_in_use());
577 assert_eq!(borrowed_device.handle.get_borrow_count(), 2);
578 }
580 assert!(borrowed_device.handle.is_in_use());
582 assert_eq!(borrowed_device.handle.get_borrow_count(), 1);
584 }
585 let borrowed_device = manager.borrow_exclusive_device(id);
587 assert!(borrowed_device.is_ok());
588 }
589
590 #[test_case]
591 fn test_borrow_out_of_bounds() {
592 let manager = DeviceManager::get_manager();
593 let borrowed_device = manager.borrow_device(999);
594 assert!(borrowed_device.is_err());
595 }
596
597 #[test_case]
598 fn test_borrow_while_exclusive() {
599 let device = Box::new(GenericDevice::new("test", 1));
600 let manager = DeviceManager::get_mut_manager();
601 let id = manager.register_device(device);
602
603 let borrowed_device = manager.borrow_exclusive_device(id);
604 assert!(borrowed_device.is_ok());
605
606 let borrowed_device2 = manager.borrow_device(id);
607 assert!(borrowed_device2.is_err());
608 }
609}