fdt_parser/base/node/
memory.rs

1use core::{iter, ops::Deref};
2
3use crate::{base::NodeBase, FdtError, MemoryRegion};
4
5#[derive(Clone)]
6pub struct Memory<'a> {
7    node: NodeBase<'a>,
8}
9
10impl<'a> Memory<'a> {
11    pub(crate) fn new(node: NodeBase<'a>) -> Self {
12        Memory { node }
13    }
14
15    /// A memory device node is required for all devicetrees and describes the physical memory layout for the system. If a system
16    /// has multiple ranges of memory, multiple memory nodes can be created, or the ranges can be specified in the reg property
17    /// of a single memory node.
18    pub fn regions(&self) -> impl Iterator<Item = Result<MemoryRegion, FdtError>> + 'a {
19        let mut reg = self.node.reg();
20        let mut has_error = false;
21        iter::from_fn(move || {
22            if has_error {
23                return None;
24            }
25            match &mut reg {
26                Ok(iter) => {
27                    let one = iter.next()?;
28                    Some(Ok(MemoryRegion {
29                        address: one.address as usize as _,
30                        size: one.size.unwrap_or_default(),
31                    }))
32                }
33                Err(e) => {
34                    has_error = true;
35                    Some(Err(e.clone()))
36                }
37            }
38        })
39    }
40
41    pub fn name(&self) -> &'a str {
42        self.node.name()
43    }
44}
45
46impl core::fmt::Debug for Memory<'_> {
47    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
48        let mut st = f.debug_struct("Memory");
49        st.field("name", &self.name());
50        for r in self.regions().flatten() {
51            st.field("region", &r);
52        }
53        st.finish()
54    }
55}
56
57impl<'a> Deref for Memory<'a> {
58    type Target = NodeBase<'a>;
59
60    fn deref(&self) -> &Self::Target {
61        &self.node
62    }
63}