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,31 @@ 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) ?;
87+ log:: debug!( "node: {:X} (#pages {})" , start, num_pages) ;
9888
99- assert ! ( size % hal:: mm:: PAGE_SIZE == 0 ) ;
100- hal:: mm:: current ( ) . identity_map_range (
89+ kpt. identity_map_range (
10190 start. into ( ) ,
102- size / hal :: mm :: PAGE_SIZE ,
91+ num_pages ,
10392 Permissions :: READ | Permissions :: WRITE ,
104- alloc_pages_for_hal ,
93+ & globals :: PHYSICAL_MEMORY_MANAGER ,
10594 ) ?;
10695 }
10796 }
@@ -110,18 +99,16 @@ fn map_dt_regions(node: &FdtNode) -> Result<(), Error> {
11099}
111100
112101fn unmap_dt_regions ( node : & FdtNode ) -> Result < ( ) , Error > {
113- let pagesize = hal:: mm:: PAGE_SIZE ;
114-
115102 if let Some ( reg) = node. reg ( ) {
116103 for memory_region in reg {
117104 let start = memory_region. starting_address as usize ;
118105 let size = memory_region. size . ok_or ( Error :: InvalidFdtNode ) ?;
119- assert ! ( size % hal :: mm :: PAGE_SIZE == 0 ) ;
106+ assert ! ( size % HAL . page_size ( ) == 0 ) ;
120107
121- let kernel_pt = hal :: mm :: current ( ) ;
122- for page in ( start..start + size) . step_by ( pagesize ) {
108+ let mut kernel_pt = HAL . kpt ( ) . lock ( ) ;
109+ for page in ( start..start + size) . step_by ( HAL . page_size ( ) ) {
123110 kernel_pt
124- . add_invalid_entry ( page. into ( ) , |_| unreachable ! ( ) )
111+ . add_invalid_entry ( page. into ( ) , & NullPageAllocator )
125112 . unwrap ( ) ;
126113 }
127114 }
0 commit comments