1use mmio::region::{MmioRegion, UnsafeMmio};
8use mmio::vmo::{VmoMapping, VmoMemory};
9
10use crate::atomic::{AtomicMmioPtr, AtomicOperand};
11
12pub struct CachedVmoMemory(VmoMemory);
15
16impl CachedVmoMemory {
17 pub unsafe fn new_unchecked(inner: VmoMemory) -> Self {
24 Self(inner)
25 }
26
27 pub fn get(&self) -> &VmoMemory {
29 &self.0
30 }
31
32 pub fn map(offset: usize, size: usize, vmo: zx::Vmo) -> Result<MmioRegion<Self>, zx::Status> {
34 let region = VmoMapping::map_with_cache_policy(offset, size, vmo, zx::CachePolicy::Cached)?;
35 Ok(region.map(Self))
36 }
37
38 pub fn new_mapped(size: usize) -> Result<MmioRegion<Self>, zx::Status> {
41 let size_u64 = u64::try_from(size).map_err(|_| zx::Status::OUT_OF_RANGE)?;
42 let vmo = zx::Vmo::create(size_u64)?;
43 Self::map(0, size, vmo)
44 }
45}
46
47impl UnsafeMmio for CachedVmoMemory {
48 fn len(&self) -> usize {
49 self.0.len()
50 }
51
52 fn align_offset(&self, align: usize) -> usize {
53 self.0.align_offset(align)
54 }
55
56 unsafe fn load8_unchecked(&self, offset: usize) -> u8 {
57 unsafe { self.0.load8_unchecked(offset) }
59 }
60
61 unsafe fn load16_unchecked(&self, offset: usize) -> u16 {
62 unsafe { self.0.load16_unchecked(offset) }
64 }
65
66 unsafe fn load32_unchecked(&self, offset: usize) -> u32 {
67 unsafe { self.0.load32_unchecked(offset) }
69 }
70
71 unsafe fn load64_unchecked(&self, offset: usize) -> u64 {
72 unsafe { self.0.load64_unchecked(offset) }
74 }
75
76 unsafe fn store8_unchecked(&self, offset: usize, v: u8) {
77 unsafe { self.0.store8_unchecked(offset, v) }
79 }
80
81 unsafe fn store16_unchecked(&self, offset: usize, v: u16) {
82 unsafe { self.0.store16_unchecked(offset, v) }
84 }
85
86 unsafe fn store32_unchecked(&self, offset: usize, v: u32) {
87 unsafe { self.0.store32_unchecked(offset, v) }
89 }
90
91 unsafe fn store64_unchecked(&self, offset: usize, v: u64) {
92 unsafe { self.0.store64_unchecked(offset, v) }
94 }
95
96 fn write_barrier(&self) {
97 self.0.write_barrier()
98 }
99
100 fn read_barrier(&self) {
101 self.0.read_barrier()
102 }
103}
104
105impl AtomicMmioPtr for CachedVmoMemory {
106 fn ptr<T: AtomicOperand>(&self, offset: usize) -> std::ptr::NonNull<T> {
107 self.0.ptr(offset)
108 }
109}