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}