resource_table/
devmem.rs

1use core::ptr::NonNull;
2
3use crate::types::{DevAddr, DevArea};
4use crate::{constants, types, util};
5
6#[repr(C)]
7#[derive(Clone, Debug)]
8pub struct DevMem {
9    pub da: DevAddr,
10    pub pa: u32,
11    pub len: u32,
12    pub flags: u32,
13    pub reserved: u32,
14    pub name: [u8; constants::RPROC_MAX_NAME_LEN],
15}
16
17impl types::ResourceType for DevMem {
18    const RESOURCE_TYPE: u32 = 1;
19}
20
21impl DevMem {
22    pub const fn new(buf: DevArea, pa: u32, flags: u32, name: &str) -> Self {
23        Self {
24            da: buf.addr,
25            pa,
26            len: buf.len as u32,
27            flags,
28            reserved: 0,
29            name: util::str_to_array(name).expect("name too long"),
30        }
31    }
32
33    pub fn get_ptr(&self) -> Option<NonNull<u8>> {
34        NonNull::new(self.da.as_ptr())
35    }
36
37    pub fn get_slice(&self) -> Option<NonNull<[u8]>> {
38        let ptr = self.get_ptr()?;
39        Some(NonNull::slice_from_raw_parts(ptr, self.len as usize))
40    }
41}