|
1 | 1 | #![allow(dead_code)] |
2 | 2 |
|
3 | 3 | use { |
| 4 | + crate::println, |
4 | 5 | core::alloc::Layout, |
5 | 6 | fdt_rs::{ |
6 | 7 | base::DevTree, |
@@ -59,34 +60,70 @@ impl<'a> DeviceTree<'a> { |
59 | 60 | } |
60 | 61 | Ok(prop.unwrap()) |
61 | 62 | } |
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(); |
74 | 63 | } |
75 | 64 |
|
76 | 65 | /// Augment DevTreeIndexProp with set of pairs accessor. |
77 | 66 | #[derive(Shrinkwrap)] |
78 | 67 | pub struct DeviceTreeProp<'a, 'i: 'a, 'dt: 'i>(DevTreeIndexProp<'a, 'i, 'dt>); |
79 | 68 |
|
| 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 | + |
80 | 112 | impl<'a, 'i: 'a, 'dt: 'i> DeviceTreeProp<'a, 'i, 'dt> { |
81 | 113 | pub fn new(source: DevTreeIndexProp<'a, 'i, 'dt>) -> Self { |
82 | 114 | Self(source) |
83 | 115 | } |
84 | 116 |
|
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 | + |
90 | 127 | PayloadPairsIter::new(&self.0, address_cells, size_cells) |
91 | 128 | } |
92 | 129 | } |
|
0 commit comments