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:: {
9+ node:: FdtNode ,
10+ standard_nodes:: MemoryRegion ,
11+ } ;
912
10- use crate :: hal ;
11- use crate :: mm :: alloc_pages_for_hal ;
12- use hal_core:: mm:: { PageMap , Permissions } ;
13+ use crate :: HAL ;
14+ use crate :: globals ;
15+ use hal_core:: mm:: { PageMap , Permissions , NullPageAllocator } ;
1316
14- pub struct DriverManager {
15- drivers : LinkedList < Arc < dyn Driver > > ,
16- }
17+ pub struct DriverManager ;
1718
1819impl 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 > {
20+ pub fn do_console ( dt : & DeviceTree ) -> Result < ( ) , Error > {
3421 let cons_node = dt. console_node ( ) . ok_or ( Error :: DeviceNotFound (
3522 "dtb doesn't contain a console node..." ,
3623 ) ) ?;
3724
3825 map_dt_regions ( & cons_node) ?;
3926
4027 if let Some ( cons_driver) =
41- self . find_driver :: < dyn Console + Sync + Send > ( & cons_node, drivers:: CONSOLE_MATCHERS )
28+ Self :: find_driver :: < dyn Console + Sync + Send > ( & cons_node, drivers:: CONSOLE_MATCHERS )
4229 {
43- self . register_console ( cons_driver) ?;
30+ kernel_console :: set_console ( cons_driver) ?;
4431 Ok ( ( ) )
4532 } else {
4633 unmap_dt_regions ( & cons_node) ?;
4734 Err ( Error :: NoMatchingDriver ( "console" ) )
4835 }
4936 }
5037
38+ pub fn map_irq_chip ( dt : & DeviceTree ) -> Result < ( ) , Error > {
39+ let intc = dt
40+ . interrupt_controller ( )
41+ . expect ( "device tree has no interrupt-controller node..." ) ;
42+
43+ map_dt_regions ( & intc) ?;
44+
45+ Ok ( ( ) )
46+ }
47+
5148 fn extract_compatibles < ' a > ( node : & ' a FdtNode ) -> impl Iterator < Item = & ' a str > {
5249 let compatible = node
5350 . properties ( )
@@ -58,7 +55,6 @@ impl DriverManager {
5855 }
5956
6057 pub fn find_driver < T : ?Sized > (
61- & self ,
6258 node : & FdtNode ,
6359 matchers : & [ & Matcher < T > ] ,
6460 ) -> Option < Box < T > > {
@@ -76,32 +72,31 @@ impl DriverManager {
7672
7773 None
7874 }
75+ }
7976
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 ( ) ) ?;
77+ fn num_pages ( memory_region : & MemoryRegion ) -> Result < usize , Error > {
78+ let size = memory_region. size . ok_or ( Error :: InvalidFdtNode ) ?;
8479
85- Ok ( ( ) )
86- }
87-
88- fn register_driver ( & mut self , drv : Arc < dyn Driver > ) {
89- self . drivers . push_back ( drv) ;
80+ if size < HAL . page_size ( ) {
81+ Ok ( 1 )
82+ } else {
83+ Ok ( size / HAL . page_size ( ) )
9084 }
9185}
9286
9387fn map_dt_regions ( node : & FdtNode ) -> Result < ( ) , Error > {
9488 if let Some ( reg) = node. reg ( ) {
89+ let mut kpt = HAL . kpt ( ) . lock ( ) ;
9590 for memory_region in reg {
9691 let start = memory_region. starting_address as usize ;
97- let size = memory_region. size . ok_or ( Error :: InvalidFdtNode ) ?;
92+ let num_pages = num_pages ( & memory_region) ?;
93+ log:: debug!( "node: {:X} (#pages {})" , start, num_pages) ;
9894
99- assert ! ( size % hal:: mm:: PAGE_SIZE == 0 ) ;
100- hal:: mm:: current ( ) . identity_map_range (
95+ kpt. identity_map_range (
10196 start. into ( ) ,
102- size / hal :: mm :: PAGE_SIZE ,
97+ num_pages ,
10398 Permissions :: READ | Permissions :: WRITE ,
104- alloc_pages_for_hal ,
99+ & globals :: PHYSICAL_MEMORY_MANAGER
105100 ) ?;
106101 }
107102 }
@@ -110,18 +105,16 @@ fn map_dt_regions(node: &FdtNode) -> Result<(), Error> {
110105}
111106
112107fn unmap_dt_regions ( node : & FdtNode ) -> Result < ( ) , Error > {
113- let pagesize = hal:: mm:: PAGE_SIZE ;
114-
115108 if let Some ( reg) = node. reg ( ) {
116109 for memory_region in reg {
117110 let start = memory_region. starting_address as usize ;
118111 let size = memory_region. size . ok_or ( Error :: InvalidFdtNode ) ?;
119- assert ! ( size % hal :: mm :: PAGE_SIZE == 0 ) ;
112+ assert ! ( size % HAL . page_size ( ) == 0 ) ;
120113
121- let kernel_pt = hal :: mm :: current ( ) ;
122- for page in ( start..start + size) . step_by ( pagesize ) {
114+ let mut kernel_pt = HAL . kpt ( ) . lock ( ) ;
115+ for page in ( start..start + size) . step_by ( HAL . page_size ( ) ) {
123116 kernel_pt
124- . add_invalid_entry ( page. into ( ) , |_| unreachable ! ( ) )
117+ . add_invalid_entry ( page. into ( ) , & NullPageAllocator )
125118 . unwrap ( ) ;
126119 }
127120 }
0 commit comments