1- use alloc::{ boxed::Box, collections::LinkedList, sync::Arc} ;
1+ use alloc::boxed::Box;
22
33use super::device_tree::DeviceTree;
44use super::drivers::{self, Matcher};
55use super::error::Error;
66use super::kernel_console;
7- use drivers::{ Console, Driver} ;
8- use fdt::node::FdtNode;
7+ use drivers::Console;
8+ use fdt::{ node::FdtNode, standard_nodes::MemoryRegion} ;
99
10- use crate::hal ;
11- use crate::mm::alloc_pages_for_hal ;
12- use hal_core::mm::{PageMap, Permissions};
10+ use crate::globals ;
11+ use crate::HAL ;
12+ use hal_core::mm::{NullPageAllocator, PageMap, Permissions};
1313
14- pub struct DriverManager {
15- drivers: LinkedList<Arc<dyn Driver>>,
16- }
14+ pub struct DriverManager;
1715
1816impl DriverManager {
19- fn new() -> Self {
20- Self {
21- drivers: LinkedList::new(),
22- }
23- }
24-
25- pub fn with_devices(dt: &DeviceTree) -> Result<Self, Error> {
26- let mut mgr = Self::new();
27-
28- mgr.do_console(dt)?;
29-
30- Ok(mgr)
31- }
32-
33- fn do_console(&mut self, dt: &DeviceTree) -> Result<(), Error> {
17+ pub fn do_console(dt: &DeviceTree) -> Result<(), Error> {
3418 let cons_node = dt.console_node().ok_or(Error::DeviceNotFound(
3519 "dtb doesn't contain a console node...",
3620 ))?;
3721
3822 map_dt_regions(&cons_node)?;
3923
4024 if let Some(cons_driver) =
41- self. find_driver::<dyn Console + Sync + Send>(&cons_node, drivers::CONSOLE_MATCHERS)
25+ Self:: find_driver::<dyn Console + Sync + Send>(&cons_node, drivers::CONSOLE_MATCHERS)
4226 {
43- self.register_console (cons_driver)?;
27+ kernel_console::set_console (cons_driver)?;
4428 Ok(())
4529 } else {
4630 unmap_dt_regions(&cons_node)?;
4731 Err(Error::NoMatchingDriver("console"))
4832 }
4933 }
5034
35+ pub fn map_irq_chip(dt: &DeviceTree) -> Result<(), Error> {
36+ let intc = dt
37+ .interrupt_controller()
38+ .expect("device tree has no interrupt-controller node...");
39+
40+ map_dt_regions(&intc)?;
41+
42+ Ok(())
43+ }
44+
5145 fn extract_compatibles<'a>(node: &'a FdtNode) -> impl Iterator<Item = &'a str> {
5246 let compatible = node
5347 .properties()
@@ -57,11 +51,7 @@ impl DriverManager {
5751 compatible.split('\0')
5852 }
5953
60- pub fn find_driver<T: ?Sized>(
61- &self,
62- node: &FdtNode,
63- matchers: &[&Matcher<T>],
64- ) -> Option<Box<T>> {
54+ pub fn find_driver<T: ?Sized>(node: &FdtNode, matchers: &[&Matcher<T>]) -> Option<Box<T>> {
6555 for compat in Self::extract_compatibles(node) {
6656 let matching_constructor = matchers
6757 .iter()
@@ -76,32 +66,30 @@ impl DriverManager {
7666
7767 None
7868 }
69+ }
7970
80- fn register_console(&mut self, cons: Box<dyn Console + Sync + Send>) -> Result<(), Error> {
81- let cons: Arc<dyn Console + Sync + Send> = Arc::from(cons);
82- self.register_driver(cons.clone());
83- kernel_console::set_console(cons.clone())?;
71+ fn num_pages(memory_region: &MemoryRegion) -> Result<usize, Error> {
72+ let size = memory_region.size.ok_or(Error::InvalidFdtNode)?;
8473
85- Ok(())
86- }
87-
88- fn register_driver(&mut self, drv: Arc<dyn Driver>) {
89- self.drivers.push_back(drv);
74+ if size < HAL.page_size() {
75+ Ok(1)
76+ } else {
77+ Ok(size / HAL.page_size())
9078 }
9179}
9280
9381fn map_dt_regions(node: &FdtNode) -> Result<(), Error> {
9482 if let Some(reg) = node.reg() {
83+ let mut kpt = HAL.kpt().lock();
9584 for memory_region in reg {
9685 let start = memory_region.starting_address as usize;
97- let size = memory_region.size.ok_or(Error::InvalidFdtNode )?;
86+ let num_pages = num_pages(&memory_region )?;
9887
99- assert!(size % hal::mm::PAGE_SIZE == 0);
100- hal::mm::current().identity_map_range(
88+ kpt.identity_map_range(
10189 start.into(),
102- size / hal::mm::PAGE_SIZE ,
90+ num_pages ,
10391 Permissions::READ | Permissions::WRITE,
104- alloc_pages_for_hal ,
92+ &globals::PHYSICAL_MEMORY_MANAGER ,
10593 )?;
10694 }
10795 }
@@ -110,18 +98,16 @@ fn map_dt_regions(node: &FdtNode) -> Result<(), Error> {
11098}
11199
112100fn unmap_dt_regions(node: &FdtNode) -> Result<(), Error> {
113- let pagesize = hal::mm::PAGE_SIZE;
114-
115101 if let Some(reg) = node.reg() {
116102 for memory_region in reg {
117103 let start = memory_region.starting_address as usize;
118104 let size = memory_region.size.ok_or(Error::InvalidFdtNode)?;
119- assert!(size % hal::mm::PAGE_SIZE == 0);
105+ assert!(size % HAL.page_size() == 0);
120106
121- let kernel_pt = hal::mm::current ();
122- for page in (start..start + size).step_by(pagesize ) {
107+ let mut kernel_pt = HAL.kpt().lock ();
108+ for page in (start..start + size).step_by(HAL.page_size() ) {
123109 kernel_pt
124- .add_invalid_entry(page.into(), |_| unreachable!() )
110+ .add_invalid_entry(page.into(), &NullPageAllocator )
125111 .unwrap();
126112 }
127113 }
0 commit comments