⚠️ VeridianOS Kernel Documentation - This is low-level kernel code. All functions are unsafe unless explicitly marked otherwise. no_std

veridian_kernel/services/
driver_framework.rs

1//! Driver Framework Implementation
2//!
3//! Provides driver registration, device enumeration, and driver-device binding.
4
5#![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/// Device event for hot-plug notifications.
15#[derive(Debug, Clone)]
16pub enum DeviceEvent {
17    /// A new device was added to the system.
18    Added(DeviceInfo),
19    /// A device was removed from the system.
20    Removed(u64),
21    /// A device's status changed.
22    StateChanged {
23        device_id: u64,
24        old: DeviceStatus,
25        new: DeviceStatus,
26    },
27}
28
29/// Trait for receiving device hot-plug events.
30///
31/// Implementors register with the driver framework via
32/// [`DriverFramework::register_event_listener`] and will receive callbacks
33/// whenever devices are added, removed, or change state.
34pub trait DeviceEventListener: Send + Sync {
35    /// Called when a device event occurs.
36    fn on_event(&self, event: &DeviceEvent);
37}
38
39/// Device class
40#[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/// Device identifier
56#[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/// Device information
67#[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)>,       // (start, end)
79    pub memory_regions: Vec<(u64, u64)>, // (start, size)
80    pub status: DeviceStatus,
81}
82
83/// Device status
84#[derive(Debug, Clone, Copy, PartialEq, Eq)]
85pub enum DeviceStatus {
86    Uninitialized,
87    Probing,
88    Active,
89    Suspended,
90    Failed,
91    Removed,
92}
93
94/// Driver operations trait
95pub trait Driver: Send + Sync {
96    /// Get driver name
97    fn name(&self) -> &str;
98
99    /// Get supported device classes
100    fn supported_classes(&self) -> Vec<DeviceClass>;
101
102    /// Check if driver supports a device
103    fn supports_device(&self, device: &DeviceInfo) -> bool;
104
105    /// Probe device
106    fn probe(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
107
108    /// Attach to device
109    fn attach(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
110
111    /// Detach from device
112    fn detach(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
113
114    /// Suspend device
115    fn suspend(&mut self) -> Result<(), KernelError>;
116
117    /// Resume device
118    fn resume(&mut self) -> Result<(), KernelError>;
119
120    /// Handle interrupt
121    fn handle_interrupt(&mut self, irq: u8) -> Result<(), KernelError>;
122
123    /// Read from device
124    fn read(&mut self, offset: u64, buffer: &mut [u8]) -> Result<usize, KernelError>;
125
126    /// Write to device
127    fn write(&mut self, offset: u64, data: &[u8]) -> Result<usize, KernelError>;
128
129    /// Device control (ioctl)
130    fn ioctl(&mut self, cmd: u32, arg: u64) -> Result<u64, KernelError>;
131}
132
133/// Bus operations trait
134pub trait Bus: Send + Sync {
135    /// Get bus name
136    fn name(&self) -> &str;
137
138    /// Scan for devices
139    fn scan(&mut self) -> Vec<DeviceInfo>;
140
141    /// Read configuration space
142    fn read_config(&self, device: &DeviceInfo, offset: u16, size: u8) -> Result<u32, KernelError>;
143
144    /// Write configuration space
145    fn write_config(
146        &mut self,
147        device: &DeviceInfo,
148        offset: u16,
149        value: u32,
150        size: u8,
151    ) -> Result<(), KernelError>;
152
153    /// Enable device
154    fn enable_device(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
155
156    /// Disable device
157    fn disable_device(&mut self, device: &DeviceInfo) -> Result<(), KernelError>;
158}
159
160/// Driver framework
161pub struct DriverFramework {
162    /// Registered drivers
163    drivers: RwLock<BTreeMap<String, Box<dyn Driver>>>,
164
165    /// Registered buses
166    buses: RwLock<BTreeMap<String, Box<dyn Bus>>>,
167
168    /// Discovered devices
169    devices: RwLock<BTreeMap<u64, DeviceInfo>>,
170
171    /// Driver-device bindings
172    bindings: RwLock<BTreeMap<u64, String>>, // device_id -> driver_name
173
174    /// Next device ID
175    next_device_id: AtomicU64,
176
177    /// IRQ handlers
178    irq_handlers: RwLock<BTreeMap<u8, Vec<String>>>, // IRQ -> driver names
179
180    /// Event listeners for device hot-plug notifications
181    event_listeners: RwLock<Vec<Arc<dyn DeviceEventListener>>>,
182}
183
184impl DriverFramework {
185    /// Create a new driver framework
186    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    /// Register a driver
207    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        // Try to bind to existing devices
221        self.probe_driver(&name)?;
222
223        Ok(())
224    }
225
226    /// Unregister a driver
227    pub fn unregister_driver(&self, name: &str) -> Result<(), KernelError> {
228        // Detach from all devices
229        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    /// Register a bus
248    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    /// Scan all buses for devices
265    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                    // Try to find a driver for this device
290                    self.probe_device(device.id)?;
291                }
292            }
293        }
294
295        Ok(total_devices)
296    }
297
298    /// Probe a device with all drivers
299    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                // Try to probe
321                if driver.probe(&device).is_ok() {
322                    // Attach driver
323                    if driver.attach(&device).is_ok() {
324                        self.bindings.write().insert(device_id, driver_name.clone());
325
326                        // Update device status
327                        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                        // Register IRQ handler if device has IRQ
333                        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    /// Probe a driver with all devices
356    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        // Check if driver exists first
366        {
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            // Check if driver supports device
378            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                // Try to probe the device
389                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                    // Try to attach the device
400                    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    /// Unbind device from driver
439    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            // Remove IRQ handler
461            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    /// Handle interrupt
478    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    /// Get device information
498    pub fn get_device(&self, device_id: u64) -> Option<DeviceInfo> {
499        self.devices.read().get(&device_id).cloned()
500    }
501
502    /// List all devices
503    pub fn list_devices(&self) -> Vec<DeviceInfo> {
504        self.devices.read().values().cloned().collect()
505    }
506
507    /// Get driver for device
508    pub fn get_device_driver(&self, device_id: u64) -> Option<String> {
509        self.bindings.read().get(&device_id).cloned()
510    }
511
512    /// Enable device
513    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    /// Disable device
538    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    /// Get all registered drivers
561    pub fn get_drivers(&self) -> Vec<String> {
562        self.drivers.read().keys().cloned().collect()
563    }
564
565    /// Register an event listener for device hot-plug notifications.
566    pub fn register_event_listener(&self, listener: Arc<dyn DeviceEventListener>) {
567        self.event_listeners.write().push(listener);
568    }
569
570    /// Unregister all event listeners (used during shutdown).
571    pub fn clear_event_listeners(&self) {
572        self.event_listeners.write().clear();
573    }
574
575    /// Notify all registered listeners of a device event.
576    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    /// Add a new device to the system (hot-plug).
584    ///
585    /// Assigns a unique device ID, registers the device, fires an `Added`
586    /// event, and attempts to auto-probe a matching driver.
587    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        // Fire Added event
600        self.notify_listeners(&DeviceEvent::Added(device));
601
602        // Try to find a driver for this device
603        self.probe_device(device_id)?;
604
605        Ok(device_id)
606    }
607
608    /// Remove a device from the system (hot-unplug).
609    ///
610    /// Unbinds any attached driver, fires a `Removed` event, and removes the
611    /// device from the registry.
612    pub fn remove_device(&self, device_id: u64) -> Result<(), KernelError> {
613        // Unbind driver if bound
614        if self.bindings.read().contains_key(&device_id) {
615            self.unbind_device(device_id)?;
616        }
617
618        // Remove device and fire event
619        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    /// Update a device's status and fire a StateChanged event.
637    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    /// Read from a device through its bound driver.
665    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    /// Write to a device through its bound driver.
691    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    /// Get statistics
717    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/// Driver framework statistics
745#[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
756/// Global driver framework using OnceLock for safe initialization.
757static DRIVER_FRAMEWORK: crate::sync::once_lock::OnceLock<DriverFramework> =
758    crate::sync::once_lock::OnceLock::new();
759
760/// Initialize the driver framework
761pub 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
772/// Try to get the global driver framework without panicking.
773///
774/// Returns `None` if the driver framework has not been initialized via
775/// [`init`].
776pub fn try_get_driver_framework() -> Option<&'static DriverFramework> {
777    DRIVER_FRAMEWORK.get()
778}
779
780/// Get the global driver framework.
781///
782/// Panics if the driver framework has not been initialized via [`init`].
783/// Prefer [`try_get_driver_framework`] in contexts where a panic is
784/// unacceptable.
785pub fn get_driver_framework() -> &'static DriverFramework {
786    DRIVER_FRAMEWORK
787        .get()
788        .expect("Driver framework not initialized: init() was not called")
789}