fdt_raw/node/
memory.rs

1use core::ops::Deref;
2
3use super::NodeBase;
4
5/// 内存区域信息
6#[derive(Debug, Clone, Copy)]
7pub struct MemoryRegion {
8    /// 起始地址
9    pub address: u64,
10    /// 区域大小
11    pub size: u64,
12}
13
14/// Memory 节点,描述物理内存布局
15#[derive(Clone)]
16pub struct Memory<'a> {
17    node: NodeBase<'a>,
18}
19
20impl<'a> Memory<'a> {
21    pub(crate) fn new(node: NodeBase<'a>) -> Self {
22        Self { node }
23    }
24
25    /// 获取内存区域迭代器
26    ///
27    /// Memory 节点的 reg 属性描述了物理内存的布局
28    pub fn regions(&self) -> impl Iterator<Item = MemoryRegion> + 'a {
29        self.node.reg().into_iter().flat_map(|reg| {
30            reg.map(|info| MemoryRegion {
31                address: info.address,
32                size: info.size.unwrap_or(0),
33            })
34        })
35    }
36
37    /// 获取所有内存区域(使用固定大小数组)
38    pub fn regions_array<const N: usize>(&self) -> heapless::Vec<MemoryRegion, N> {
39        let mut result = heapless::Vec::new();
40        for region in self.regions() {
41            if result.push(region).is_err() {
42                break;
43            }
44        }
45        result
46    }
47
48    /// 计算总内存大小
49    pub fn total_size(&self) -> u64 {
50        self.regions().map(|r| r.size).sum()
51    }
52}
53
54impl<'a> Deref for Memory<'a> {
55    type Target = NodeBase<'a>;
56
57    fn deref(&self) -> &Self::Target {
58        &self.node
59    }
60}
61
62impl core::fmt::Debug for Memory<'_> {
63    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
64        let mut st = f.debug_struct("Memory");
65        st.field("name", &self.node.name());
66        for region in self.regions() {
67            st.field("region", &region);
68        }
69        st.finish()
70    }
71}