1#![allow(clippy::unwrap_or_default)]
6
7use alloc::{boxed::Box, collections::BTreeMap, string::String, sync::Arc, vec::Vec};
8use core::sync::atomic::{AtomicU64, Ordering};
9
10use spin::RwLock;
11
12use crate::error::KernelError;
13
14#[derive(Debug, Clone)]
16pub enum DeviceEvent {
17 Added(DeviceInfo),
19 Removed(u64),
21 StateChanged {
23 device_id: u64,
24 old: DeviceStatus,
25 new: DeviceStatus,
26 },
27}
28
29pub trait DeviceEventListener: Send + Sync {
35 fn on_event(&self, event: &DeviceEvent);
37}
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq)]
41pub enum DeviceClass {
42 Character,
43 Block,
44 Network,
45 Input,
46 Display,
47 Audio,
48 USB,
49 PCI,
50 Storage,
51 Serial,
52 Other,
53}
54
55#[derive(Debug, Clone)]
57pub struct DeviceId {
58 pub vendor_id: u16,
59 pub device_id: u16,
60 pub class_code: u8,
61 pub subclass: u8,
62 pub prog_if: u8,
63 pub revision: u8,
64}
65
66#[derive(Debug, Clone)]
68pub struct DeviceInfo {
69 pub id: u64,
70 pub name: String,
71 pub class: DeviceClass,
72 pub device_id: Option<DeviceId>,
73 pub driver: Option<String>,
74 pub bus: String,
75 pub address: u64,
76 pub irq: Option<u8>,
77 pub dma_channels: Vec<u8>,
78 pub io_ports: Vec<(u16, u16)>, pub memory_regions: Vec<(u64, u64)>, pub status: DeviceStatus,
81}
82
83#[derive(Debug, Clone, Copy, PartialEq, Eq)]
85pub enum DeviceStatus {
86 Uninitialized,
87 Probing,
88 Active,
89 Suspended,
90 Failed,
91 Removed,
92}
93
94pub trait Driver: Send + Sync {
96 fn name(&self) -> &str;
98
99 fn supported_classes(&self) -> Vec<DeviceClass>;
101
102 fn supports_device(&self, device: &DeviceInfo) -> bool;
104
105 fn probe(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
107
108 fn attach(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
110
111 fn detach(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
113
114 fn suspend(&mut self) -> Result<(), KernelError>;
116
117 fn resume(&mut self) -> Result<(), KernelError>;
119
120 fn handle_interrupt(&mut self, irq: u8) -> Result<(), KernelError>;
122
123 fn read(&mut self, offset: u64, buffer: &mut [u8]) -> Result<usize, KernelError>;
125
126 fn write(&mut self, offset: u64, data: &[u8]) -> Result<usize, KernelError>;
128
129 fn ioctl(&mut self, cmd: u32, arg: u64) -> Result<u64, KernelError>;
131}
132
133pub trait Bus: Send + Sync {
135 fn name(&self) -> &str;
137
138 fn scan(&mut self) -> Vec<DeviceInfo>;
140
141 fn read_config(&self, device: &DeviceInfo, offset: u16, size: u8) -> Result<u32, KernelError>;
143
144 fn write_config(
146 &mut self,
147 device: &DeviceInfo,
148 offset: u16,
149 value: u32,
150 size: u8,
151 ) -> Result<(), KernelError>;
152
153 fn enable_device(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
155
156 fn disable_device(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
158}
159
160pub struct DriverFramework {
162 drivers: RwLock<BTreeMap<String, Box<dyn Driver>>>,
164
165 buses: RwLock<BTreeMap<String, Box<dyn Bus>>>,
167
168 devices: RwLock<BTreeMap<u64, DeviceInfo>>,
170
171 bindings: RwLock<BTreeMap<u64, String>>, next_device_id: AtomicU64,
176
177 irq_handlers: RwLock<BTreeMap<u8, Vec<String>>>, event_listeners: RwLock<Vec<Arc<dyn DeviceEventListener>>>,
182}
183
184impl DriverFramework {
185 pub fn new() -> Self {
187 Self {
188 drivers: RwLock::new(BTreeMap::new()),
189 buses: RwLock::new(BTreeMap::new()),
190 devices: RwLock::new(BTreeMap::new()),
191 bindings: RwLock::new(BTreeMap::new()),
192 next_device_id: AtomicU64::new(1),
193 irq_handlers: RwLock::new(BTreeMap::new()),
194 event_listeners: RwLock::new(Vec::new()),
195 }
196 }
197}
198
199impl Default for DriverFramework {
200 fn default() -> Self {
201 Self::new()
202 }
203}
204
205impl DriverFramework {
206 pub fn register_driver(&self, driver: Box<dyn Driver>) -> Result<(), KernelError> {
208 let name: String = driver.name().into();
209
210 if self.drivers.read().contains_key(&name) {
211 return Err(KernelError::AlreadyExists {
212 resource: "driver",
213 id: 0,
214 });
215 }
216
217 crate::println!("[DRIVER_FRAMEWORK] Registering driver: {}", name);
218 self.drivers.write().insert(name.clone(), driver);
219
220 self.probe_driver(&name)?;
222
223 Ok(())
224 }
225
226 pub fn unregister_driver(&self, name: &str) -> Result<(), KernelError> {
228 let devices_to_detach: Vec<u64> = self
230 .bindings
231 .read()
232 .iter()
233 .filter(|(_, driver)| driver == &name)
234 .map(|(device_id, _)| *device_id)
235 .collect();
236
237 for device_id in devices_to_detach {
238 self.unbind_device(device_id)?;
239 }
240
241 self.drivers.write().remove(name);
242 crate::println!("[DRIVER_FRAMEWORK] Unregistered driver: {}", name);
243
244 Ok(())
245 }
246
247 pub fn register_bus(&self, bus: Box<dyn Bus>) -> Result<(), KernelError> {
249 let name = bus.name().into();
250
251 if self.buses.read().contains_key(&name) {
252 return Err(KernelError::AlreadyExists {
253 resource: "bus",
254 id: 0,
255 });
256 }
257
258 crate::println!("[DRIVER_FRAMEWORK] Registering bus: {}", name);
259 self.buses.write().insert(name, bus);
260
261 Ok(())
262 }
263
264 pub fn scan_buses(&self) -> Result<usize, KernelError> {
266 let mut total_devices = 0;
267
268 let mut buses = self.buses.write();
269 let bus_names: Vec<String> = buses.keys().cloned().collect();
270
271 for bus_name in bus_names {
272 if let Some(bus) = buses.get_mut(&bus_name) {
273 crate::println!("[DRIVER_FRAMEWORK] Scanning bus: {}", bus_name);
274 let devices = bus.scan();
275
276 for mut device in devices {
277 device.id = self.next_device_id.fetch_add(1, Ordering::SeqCst);
278 device.bus = bus_name.clone();
279
280 crate::println!(
281 "[DRIVER_FRAMEWORK] Found device: {} on {}",
282 device.name,
283 bus_name
284 );
285
286 self.devices.write().insert(device.id, device.clone());
287 total_devices += 1;
288
289 self.probe_device(device.id)?;
291 }
292 }
293 }
294
295 Ok(total_devices)
296 }
297
298 fn probe_device(&self, device_id: u64) -> Result<(), KernelError> {
300 let device = self
301 .devices
302 .read()
303 .get(&device_id)
304 .cloned()
305 .ok_or(KernelError::NotFound {
306 resource: "device",
307 id: device_id,
308 })?;
309
310 let mut drivers = self.drivers.write();
311
312 for (driver_name, driver) in drivers.iter_mut() {
313 if driver.supports_device(&device) {
314 crate::println!(
315 "[DRIVER_FRAMEWORK] Driver {} supports device {}",
316 driver_name,
317 device.name
318 );
319
320 if driver.probe(&device).is_ok() {
322 if driver.attach(&device).is_ok() {
324 self.bindings.write().insert(device_id, driver_name.clone());
325
326 if let Some(dev) = self.devices.write().get_mut(&device_id) {
328 dev.driver = Some(driver_name.clone());
329 dev.status = DeviceStatus::Active;
330 }
331
332 if let Some(irq) = device.irq {
334 self.irq_handlers
335 .write()
336 .entry(irq)
337 .or_insert_with(Vec::new)
338 .push(driver_name.clone());
339 }
340
341 crate::println!(
342 "[DRIVER_FRAMEWORK] Bound driver {} to device {}",
343 driver_name,
344 device.name
345 );
346 return Ok(());
347 }
348 }
349 }
350 }
351
352 Ok(())
353 }
354
355 fn probe_driver(&self, driver_name: &str) -> Result<(), KernelError> {
357 let devices: Vec<(u64, DeviceInfo)> = self
358 .devices
359 .read()
360 .iter()
361 .filter(|(_, dev)| dev.driver.is_none())
362 .map(|(id, dev)| (*id, dev.clone()))
363 .collect();
364
365 {
367 let drivers = self.drivers.read();
368 if !drivers.contains_key(driver_name) {
369 return Err(KernelError::NotFound {
370 resource: "driver",
371 id: 0,
372 });
373 }
374 }
375
376 for (device_id, device) in devices {
377 let supports = {
379 let mut drivers = self.drivers.write();
380 if let Some(driver) = drivers.get_mut(driver_name) {
381 driver.supports_device(&device)
382 } else {
383 false
384 }
385 };
386
387 if supports {
388 let probe_ok = {
390 let mut drivers = self.drivers.write();
391 if let Some(driver) = drivers.get_mut(driver_name) {
392 driver.probe(&device).is_ok()
393 } else {
394 false
395 }
396 };
397
398 if probe_ok {
399 let attach_ok = {
401 let mut drivers = self.drivers.write();
402 if let Some(driver) = drivers.get_mut(driver_name) {
403 driver.attach(&device).is_ok()
404 } else {
405 false
406 }
407 };
408
409 if attach_ok {
410 self.bindings.write().insert(device_id, driver_name.into());
411
412 if let Some(dev) = self.devices.write().get_mut(&device_id) {
413 dev.driver = Some(driver_name.into());
414 dev.status = DeviceStatus::Active;
415 }
416
417 if let Some(irq) = device.irq {
418 self.irq_handlers
419 .write()
420 .entry(irq)
421 .or_insert_with(Vec::new)
422 .push(driver_name.into());
423 }
424
425 crate::println!(
426 "[DRIVER_FRAMEWORK] Bound driver {} to device {}",
427 driver_name,
428 device.name
429 );
430 }
431 }
432 }
433 }
434
435 Ok(())
436 }
437
438 fn unbind_device(&self, device_id: u64) -> Result<(), KernelError> {
440 if let Some(driver_name) = self.bindings.write().remove(&device_id) {
441 let device =
442 self.devices
443 .read()
444 .get(&device_id)
445 .cloned()
446 .ok_or(KernelError::NotFound {
447 resource: "device",
448 id: device_id,
449 })?;
450
451 if let Some(driver) = self.drivers.write().get_mut(&driver_name) {
452 driver.detach(&device)?;
453 }
454
455 if let Some(dev) = self.devices.write().get_mut(&device_id) {
456 dev.driver = None;
457 dev.status = DeviceStatus::Uninitialized;
458 }
459
460 if let Some(irq) = device.irq {
462 if let Some(handlers) = self.irq_handlers.write().get_mut(&irq) {
463 handlers.retain(|name| name != &driver_name);
464 }
465 }
466
467 crate::println!(
468 "[DRIVER_FRAMEWORK] Unbound device {} from driver {}",
469 device.name,
470 driver_name
471 );
472 }
473
474 Ok(())
475 }
476
477 pub fn handle_interrupt(&self, irq: u8) -> Result<(), KernelError> {
479 let handler_names = self
480 .irq_handlers
481 .read()
482 .get(&irq)
483 .cloned()
484 .unwrap_or_default();
485
486 let mut drivers = self.drivers.write();
487
488 for handler_name in handler_names {
489 if let Some(driver) = drivers.get_mut(&handler_name) {
490 driver.handle_interrupt(irq)?;
491 }
492 }
493
494 Ok(())
495 }
496
497 pub fn get_device(&self, device_id: u64) -> Option<DeviceInfo> {
499 self.devices.read().get(&device_id).cloned()
500 }
501
502 pub fn list_devices(&self) -> Vec<DeviceInfo> {
504 self.devices.read().values().cloned().collect()
505 }
506
507 pub fn get_device_driver(&self, device_id: u64) -> Option<String> {
509 self.bindings.read().get(&device_id).cloned()
510 }
511
512 pub fn enable_device(&self, device_id: u64) -> Result<(), KernelError> {
514 let device = self
515 .devices
516 .read()
517 .get(&device_id)
518 .cloned()
519 .ok_or(KernelError::NotFound {
520 resource: "device",
521 id: device_id,
522 })?;
523
524 if let Some(bus) = self.buses.write().get_mut(&device.bus) {
525 bus.enable_device(&device)?;
526
527 if let Some(dev) = self.devices.write().get_mut(&device_id) {
528 if dev.status == DeviceStatus::Suspended {
529 dev.status = DeviceStatus::Active;
530 }
531 }
532 }
533
534 Ok(())
535 }
536
537 pub fn disable_device(&self, device_id: u64) -> Result<(), KernelError> {
539 let device = self
540 .devices
541 .read()
542 .get(&device_id)
543 .cloned()
544 .ok_or(KernelError::NotFound {
545 resource: "device",
546 id: device_id,
547 })?;
548
549 if let Some(bus) = self.buses.write().get_mut(&device.bus) {
550 bus.disable_device(&device)?;
551
552 if let Some(dev) = self.devices.write().get_mut(&device_id) {
553 dev.status = DeviceStatus::Suspended;
554 }
555 }
556
557 Ok(())
558 }
559
560 pub fn get_drivers(&self) -> Vec<String> {
562 self.drivers.read().keys().cloned().collect()
563 }
564
565 pub fn register_event_listener(&self, listener: Arc<dyn DeviceEventListener>) {
567 self.event_listeners.write().push(listener);
568 }
569
570 pub fn clear_event_listeners(&self) {
572 self.event_listeners.write().clear();
573 }
574
575 fn notify_listeners(&self, event: &DeviceEvent) {
577 let listeners = self.event_listeners.read();
578 for listener in listeners.iter() {
579 listener.on_event(event);
580 }
581 }
582
583 pub fn add_device(&self, mut device: DeviceInfo) -> Result<u64, KernelError> {
588 device.id = self.next_device_id.fetch_add(1, Ordering::SeqCst);
589 let device_id = device.id;
590
591 crate::println!(
592 "[DRIVER_FRAMEWORK] Hot-plug: adding device {} (id={})",
593 device.name,
594 device_id
595 );
596
597 self.devices.write().insert(device_id, device.clone());
598
599 self.notify_listeners(&DeviceEvent::Added(device));
601
602 self.probe_device(device_id)?;
604
605 Ok(device_id)
606 }
607
608 pub fn remove_device(&self, device_id: u64) -> Result<(), KernelError> {
613 if self.bindings.read().contains_key(&device_id) {
615 self.unbind_device(device_id)?;
616 }
617
618 let removed = self.devices.write().remove(&device_id);
620
621 if let Some(_dev) = removed {
622 crate::println!(
623 "[DRIVER_FRAMEWORK] Hot-unplug: removed device (id={})",
624 device_id
625 );
626 self.notify_listeners(&DeviceEvent::Removed(device_id));
627 Ok(())
628 } else {
629 Err(KernelError::NotFound {
630 resource: "device",
631 id: device_id,
632 })
633 }
634 }
635
636 pub fn update_device_status(
638 &self,
639 device_id: u64,
640 new_status: DeviceStatus,
641 ) -> Result<(), KernelError> {
642 let old_status = {
643 let mut devices = self.devices.write();
644 let dev = devices.get_mut(&device_id).ok_or(KernelError::NotFound {
645 resource: "device",
646 id: device_id,
647 })?;
648 let old = dev.status;
649 dev.status = new_status;
650 old
651 };
652
653 if old_status != new_status {
654 self.notify_listeners(&DeviceEvent::StateChanged {
655 device_id,
656 old: old_status,
657 new: new_status,
658 });
659 }
660
661 Ok(())
662 }
663
664 pub fn read_device(
666 &self,
667 device_id: u64,
668 offset: u64,
669 buffer: &mut [u8],
670 ) -> Result<usize, KernelError> {
671 let driver_name =
672 self.bindings
673 .read()
674 .get(&device_id)
675 .cloned()
676 .ok_or(KernelError::NotFound {
677 resource: "device binding",
678 id: device_id,
679 })?;
680
681 let mut drivers = self.drivers.write();
682 let driver = drivers.get_mut(&driver_name).ok_or(KernelError::NotFound {
683 resource: "driver",
684 id: 0,
685 })?;
686
687 driver.read(offset, buffer)
688 }
689
690 pub fn write_device(
692 &self,
693 device_id: u64,
694 offset: u64,
695 data: &[u8],
696 ) -> Result<usize, KernelError> {
697 let driver_name =
698 self.bindings
699 .read()
700 .get(&device_id)
701 .cloned()
702 .ok_or(KernelError::NotFound {
703 resource: "device binding",
704 id: device_id,
705 })?;
706
707 let mut drivers = self.drivers.write();
708 let driver = drivers.get_mut(&driver_name).ok_or(KernelError::NotFound {
709 resource: "driver",
710 id: 0,
711 })?;
712
713 driver.write(offset, data)
714 }
715
716 pub fn get_statistics(&self) -> DriverFrameworkStats {
718 let devices = self.devices.read();
719 let mut active = 0;
720 let mut failed = 0;
721 let mut suspended = 0;
722
723 for device in devices.values() {
724 match device.status {
725 DeviceStatus::Active => active += 1,
726 DeviceStatus::Failed => failed += 1,
727 DeviceStatus::Suspended => suspended += 1,
728 _ => {}
729 }
730 }
731
732 DriverFrameworkStats {
733 total_drivers: self.drivers.read().len(),
734 total_buses: self.buses.read().len(),
735 total_devices: devices.len(),
736 bound_devices: self.bindings.read().len(),
737 active_devices: active,
738 failed_devices: failed,
739 suspended_devices: suspended,
740 }
741 }
742}
743
744#[derive(Debug)]
746pub struct DriverFrameworkStats {
747 pub total_drivers: usize,
748 pub total_buses: usize,
749 pub total_devices: usize,
750 pub bound_devices: usize,
751 pub active_devices: usize,
752 pub failed_devices: usize,
753 pub suspended_devices: usize,
754}
755
756static DRIVER_FRAMEWORK: crate::sync::once_lock::OnceLock<DriverFramework> =
758 crate::sync::once_lock::OnceLock::new();
759
760pub fn init() {
762 #[allow(unused_imports)]
763 use crate::println;
764
765 println!("[DRIVER_FRAMEWORK] Creating new DriverFramework...");
766 match DRIVER_FRAMEWORK.set(DriverFramework::new()) {
767 Ok(()) => println!("[DRIVER_FRAMEWORK] Driver framework initialized"),
768 Err(_) => println!("[DRIVER_FRAMEWORK] Already initialized, skipping..."),
769 }
770}
771
772pub fn try_get_driver_framework() -> Option<&'static DriverFramework> {
777 DRIVER_FRAMEWORK.get()
778}
779
780pub fn get_driver_framework() -> &'static DriverFramework {
786 DRIVER_FRAMEWORK
787 .get()
788 .expect("Driver framework not initialized: init() was not called")
789}