aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32-wpan/src/sub/mm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32-wpan/src/sub/mm.rs')
-rw-r--r--embassy-stm32-wpan/src/sub/mm.rs37
1 files changed, 20 insertions, 17 deletions
diff --git a/embassy-stm32-wpan/src/sub/mm.rs b/embassy-stm32-wpan/src/sub/mm.rs
index a90c6ee55..aac252929 100644
--- a/embassy-stm32-wpan/src/sub/mm.rs
+++ b/embassy-stm32-wpan/src/sub/mm.rs
@@ -5,26 +5,26 @@ use core::task::Poll;
5 5
6use aligned::{A4, Aligned}; 6use aligned::{A4, Aligned};
7use cortex_m::interrupt; 7use cortex_m::interrupt;
8use embassy_stm32::ipcc::Ipcc; 8use embassy_stm32::ipcc::IpccTxChannel;
9use embassy_sync::waitqueue::AtomicWaker; 9use embassy_sync::waitqueue::AtomicWaker;
10 10
11use crate::consts::POOL_SIZE; 11use crate::consts::POOL_SIZE;
12use crate::evt;
12use crate::evt::EvtPacket; 13use crate::evt::EvtPacket;
13#[cfg(feature = "ble")] 14#[cfg(feature = "ble")]
14use crate::tables::BLE_SPARE_EVT_BUF; 15use crate::tables::BLE_SPARE_EVT_BUF;
15use crate::tables::{EVT_POOL, FREE_BUF_QUEUE, MemManagerTable, SYS_SPARE_EVT_BUF, TL_MEM_MANAGER_TABLE}; 16use crate::tables::{EVT_POOL, FREE_BUF_QUEUE, MemManagerTable, SYS_SPARE_EVT_BUF, TL_MEM_MANAGER_TABLE};
16use crate::unsafe_linked_list::LinkedListNode; 17use crate::unsafe_linked_list::LinkedListNode;
17use crate::{channels, evt};
18 18
19static MM_WAKER: AtomicWaker = AtomicWaker::new(); 19static MM_WAKER: AtomicWaker = AtomicWaker::new();
20static mut LOCAL_FREE_BUF_QUEUE: Aligned<A4, MaybeUninit<LinkedListNode>> = Aligned(MaybeUninit::uninit()); 20static mut LOCAL_FREE_BUF_QUEUE: Aligned<A4, MaybeUninit<LinkedListNode>> = Aligned(MaybeUninit::uninit());
21 21
22pub struct MemoryManager { 22pub struct MemoryManager<'a> {
23 _private: (), 23 ipcc_mm_release_buffer_channel: IpccTxChannel<'a>,
24} 24}
25 25
26impl MemoryManager { 26impl<'a> MemoryManager<'a> {
27 pub(crate) fn new() -> Self { 27 pub(crate) fn new(ipcc_mm_release_buffer_channel: IpccTxChannel<'a>) -> Self {
28 unsafe { 28 unsafe {
29 LinkedListNode::init_head(FREE_BUF_QUEUE.as_mut_ptr()); 29 LinkedListNode::init_head(FREE_BUF_QUEUE.as_mut_ptr());
30 LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()); 30 LinkedListNode::init_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr());
@@ -43,10 +43,12 @@ impl MemoryManager {
43 }); 43 });
44 } 44 }
45 45
46 Self { _private: () } 46 Self {
47 ipcc_mm_release_buffer_channel,
48 }
47 } 49 }
48 50
49 pub async fn run_queue(&self) -> ! { 51 pub async fn run_queue(&mut self) -> ! {
50 loop { 52 loop {
51 poll_fn(|cx| unsafe { 53 poll_fn(|cx| unsafe {
52 MM_WAKER.register(cx.waker()); 54 MM_WAKER.register(cx.waker());
@@ -58,20 +60,21 @@ impl MemoryManager {
58 }) 60 })
59 .await; 61 .await;
60 62
61 Ipcc::send(channels::cpu1::IPCC_MM_RELEASE_BUFFER_CHANNEL, || { 63 self.ipcc_mm_release_buffer_channel
62 interrupt::free(|_| unsafe { 64 .send(|| {
63 // CS required while moving nodes 65 interrupt::free(|_| unsafe {
64 while let Some(node_ptr) = LinkedListNode::remove_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) { 66 // CS required while moving nodes
65 LinkedListNode::insert_head(FREE_BUF_QUEUE.as_mut_ptr(), node_ptr); 67 while let Some(node_ptr) = LinkedListNode::remove_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) {
66 } 68 LinkedListNode::insert_head(FREE_BUF_QUEUE.as_mut_ptr(), node_ptr);
69 }
70 })
67 }) 71 })
68 }) 72 .await;
69 .await;
70 } 73 }
71 } 74 }
72} 75}
73 76
74impl evt::MemoryManager for MemoryManager { 77impl<'a> evt::MemoryManager for MemoryManager<'a> {
75 /// SAFETY: passing a pointer to something other than a managed event packet is UB 78 /// SAFETY: passing a pointer to something other than a managed event packet is UB
76 unsafe fn drop_event_packet(evt: *mut EvtPacket) { 79 unsafe fn drop_event_packet(evt: *mut EvtPacket) {
77 interrupt::free(|_| unsafe { 80 interrupt::free(|_| unsafe {