Skip to content

Commit 873cce6

Browse files
committed
wip: calc address-cells and size-cells internally
1 parent efd0b36 commit 873cce6

File tree

2 files changed

+55
-44
lines changed

2 files changed

+55
-44
lines changed

machine/src/device_tree.rs

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![allow(dead_code)]
22

33
use {
4+
crate::println,
45
core::alloc::Layout,
56
fdt_rs::{
67
base::DevTree,
@@ -59,34 +60,70 @@ impl<'a> DeviceTree<'a> {
5960
}
6061
Ok(prop.unwrap())
6162
}
62-
63-
// // @todo boot this on 8Gb RasPi, because I'm not sure how it allocates memory regions there.
64-
// println!("Address cells: {}, size cells {}", address_cells, size_cells);
65-
//
66-
// let mem_prop = device_tree -- node
67-
// .props()
68-
// -- node with property named "device_type" and value "memory"
69-
// .find(|p| Ok(p.name()? == "device_type" && p.str()? == "memory"))
70-
// .unwrap()
71-
// .expect("Unable to find memory node.");
72-
// let mem_node = mem_prop.node();
73-
// // let parent_node = mem_node.parent_node();
7463
}
7564

7665
/// Augment DevTreeIndexProp with set of pairs accessor.
7766
#[derive(Shrinkwrap)]
7867
pub struct DeviceTreeProp<'a, 'i: 'a, 'dt: 'i>(DevTreeIndexProp<'a, 'i, 'dt>);
7968

69+
fn get_address_cells<'a, 'i: 'a, 'dt: 'i>(node: &DevTreeIndexNode<'a, 'i, 'dt>) -> u32 {
70+
let mut prop_iter = node.props();
71+
let res: Result<_, DevTreeError> =
72+
prop_iter.try_find(|prop| Ok(prop.name()? == "#address-cells"));
73+
74+
if res.is_ok() {
75+
return res.unwrap().expect("Non-none!").u32(0).unwrap();
76+
}
77+
78+
while let Some(node) = node.parent() {
79+
let mut prop_iter = node.props();
80+
let res: Result<_, DevTreeError> =
81+
prop_iter.try_find(|prop| Ok(prop.name()? == "#address-cells"));
82+
83+
if res.is_ok() {
84+
return res.unwrap().expect("Non-none!").u32(0).unwrap();
85+
}
86+
}
87+
88+
return 1;
89+
}
90+
91+
fn get_size_cells<'a, 'i: 'a, 'dt: 'i>(node: &DevTreeIndexNode<'a, 'i, 'dt>) -> u32 {
92+
let mut prop_iter = node.props();
93+
let res: Result<_, DevTreeError> = prop_iter.try_find(|prop| Ok(prop.name()? == "#size-cells"));
94+
95+
if res.is_ok() {
96+
return res.unwrap().expect("Non-none!").u32(0).unwrap();
97+
}
98+
99+
while let Some(node) = node.parent() {
100+
let mut prop_iter = node.props();
101+
let res: Result<_, DevTreeError> =
102+
prop_iter.try_find(|prop| Ok(prop.name()? == "#size-cells"));
103+
104+
if res.is_ok() {
105+
return res.unwrap().expect("Non-none!").u32(0).unwrap();
106+
}
107+
}
108+
109+
return 1;
110+
}
111+
80112
impl<'a, 'i: 'a, 'dt: 'i> DeviceTreeProp<'a, 'i, 'dt> {
81113
pub fn new(source: DevTreeIndexProp<'a, 'i, 'dt>) -> Self {
82114
Self(source)
83115
}
84116

85-
pub fn payload_pairs_iter(
86-
&'a self,
87-
address_cells: u32,
88-
size_cells: u32,
89-
) -> PayloadPairsIter<'a, 'i, 'dt> {
117+
pub fn payload_pairs_iter(&'a self) -> PayloadPairsIter<'a, 'i, 'dt> {
118+
let address_cells = get_address_cells(&self.node());
119+
let size_cells = get_size_cells(&self.node());
120+
121+
// @todo boot this on 8Gb RasPi, because I'm not sure how it allocates memory regions there.
122+
println!(
123+
"Address cells: {}, size cells {}",
124+
address_cells, size_cells
125+
);
126+
90127
PayloadPairsIter::new(&self.0, address_cells, size_cells)
91128
}
92129
}

nucleus/src/main.rs

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -167,24 +167,6 @@ pub fn kmain(dtb: u32) -> ! {
167167
// 2. From those read reg entries, using `/#address-cells` and `/#size-cells` as units
168168
// 3. Union of all these reg entries will be the available memory. Enter it as mem-regions.
169169

170-
let address_cells = device_tree
171-
.get_prop_by_path("/#address-cells")
172-
.expect("Unable to figure out #address-cells")
173-
.u32(0)
174-
.expect("Invalid format for #address-cells");
175-
176-
let size_cells = device_tree
177-
.get_prop_by_path("/#size-cells")
178-
.expect("Unable to figure out #size-cells")
179-
.u32(0)
180-
.expect("Invalid format for #size-cells");
181-
182-
// @todo boot this on 8Gb RasPi, because I'm not sure how it allocates memory regions there.
183-
println!(
184-
"Address cells: {}, size cells {}",
185-
address_cells, size_cells
186-
);
187-
188170
let res: Result<_, DevTreeError> = device_tree
189171
.props()
190172
.try_find(|p| Ok(p.name()? == "device_type" && p.str()? == "memory"));
@@ -204,7 +186,7 @@ pub fn kmain(dtb: u32) -> ! {
204186

205187
let reg_prop = DeviceTreeProp::new(reg_prop);
206188

207-
for (mem_addr, mem_size) in reg_prop.payload_pairs_iter(address_cells, size_cells) {
189+
for (mem_addr, mem_size) in reg_prop.payload_pairs_iter() {
208190
println!("Memory: {} KiB at offset {}", mem_size / 1024, mem_addr);
209191
}
210192

@@ -229,14 +211,6 @@ pub fn kmain(dtb: u32) -> ! {
229211
dtb
230212
);
231213

232-
// let address_cells = device_tree.try_struct_u32_value("/#address-cells");
233-
// let size_cells = device_tree.try_struct_u32_value("/#size-cells");
234-
235-
// println!(
236-
// "Memory DTB info: address-cells {:?}, size-cells {:?}",
237-
// address_cells, size_cells
238-
// );
239-
240214
dump_memory_map();
241215

242216
#[cfg(test)]

0 commit comments

Comments
 (0)