aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThales <[email protected]>2021-06-30 19:08:17 -0300
committerGitHub <[email protected]>2021-06-30 19:08:17 -0300
commit334c3a44a42873b6d60d7020ece3f8e90870796f (patch)
tree472d7573dc6395958e12db9eb267b28b61cec664
parentd77d41193508795417f0b19bdc6153e92233da8e (diff)
parente07dda8707acf30acd6af008b55fba0e6513b931 (diff)
Merge pull request #265 from thalesfragoso/some-fences
stm32: Adjust some fences around DMA
-rw-r--r--embassy-stm32/src/dma/v2.rs17
m---------stm32-data0
2 files changed, 8 insertions, 9 deletions
diff --git a/embassy-stm32/src/dma/v2.rs b/embassy-stm32/src/dma/v2.rs
index 93b3cb869..e7cd24710 100644
--- a/embassy-stm32/src/dma/v2.rs
+++ b/embassy-stm32/src/dma/v2.rs
@@ -1,5 +1,6 @@
1use core::sync::atomic::{AtomicU8, Ordering};
2use core::task::Poll; 1use core::task::Poll;
2
3use atomic_polyfill::{AtomicU8, Ordering};
3use embassy::interrupt::{Interrupt, InterruptExt}; 4use embassy::interrupt::{Interrupt, InterruptExt};
4use embassy::util::AtomicWaker; 5use embassy::util::AtomicWaker;
5use futures::future::poll_fn; 6use futures::future::poll_fn;
@@ -53,7 +54,8 @@ pub(crate) async unsafe fn transfer_p2m(
53 assert!(dst.len() <= 0xFFFF); 54 assert!(dst.len() <= 0xFFFF);
54 55
55 // Reset status 56 // Reset status
56 STATE.ch_status[n].store(CH_STATUS_NONE, Ordering::Relaxed); 57 // Generate a DMB here to flush the store buffer (M7) before enabling the DMA
58 STATE.ch_status[n].store(CH_STATUS_NONE, Ordering::Release);
57 59
58 unsafe { 60 unsafe {
59 c.par().write_value(src as _); 61 c.par().write_value(src as _);
@@ -99,13 +101,13 @@ pub(crate) async unsafe fn transfer_m2p(
99 assert!(src.len() <= 0xFFFF); 101 assert!(src.len() <= 0xFFFF);
100 102
101 // Reset status 103 // Reset status
102 STATE.ch_status[n].store(CH_STATUS_NONE, Ordering::Relaxed); 104 // Generate a DMB here to flush the store buffer (M7) before enabling the DMA
105 STATE.ch_status[n].store(CH_STATUS_NONE, Ordering::Release);
103 106
104 unsafe { 107 unsafe {
105 c.par().write_value(dst as _); 108 c.par().write_value(dst as _);
106 c.m0ar().write_value(src.as_ptr() as _); 109 c.m0ar().write_value(src.as_ptr() as _);
107 c.ndtr().write_value(regs::Ndtr(src.len() as _)); 110 c.ndtr().write_value(regs::Ndtr(src.len() as _));
108 compiler_fence(Ordering::AcqRel);
109 c.cr().write(|w| { 111 c.cr().write(|w| {
110 w.set_dir(vals::Dir::MEMORYTOPERIPHERAL); 112 w.set_dir(vals::Dir::MEMORYTOPERIPHERAL);
111 w.set_msize(vals::Size::BITS8); 113 w.set_msize(vals::Size::BITS8);
@@ -131,8 +133,6 @@ pub(crate) async unsafe fn transfer_m2p(
131 }) 133 })
132 .await; 134 .await;
133 135
134 compiler_fence(Ordering::AcqRel);
135
136 // TODO handle error 136 // TODO handle error
137 assert!(res == CH_STATUS_COMPLETED); 137 assert!(res == CH_STATUS_COMPLETED);
138} 138}
@@ -148,10 +148,10 @@ unsafe fn on_irq() {
148 for chn in 0..4 { 148 for chn in 0..4 {
149 let n = dman * 8 + isrn * 4 + chn; 149 let n = dman * 8 + isrn * 4 + chn;
150 if isr.teif(chn) { 150 if isr.teif(chn) {
151 STATE.ch_status[n].store(CH_STATUS_ERROR, Ordering::Release); 151 STATE.ch_status[n].store(CH_STATUS_ERROR, Ordering::Relaxed);
152 STATE.ch_wakers[n].wake(); 152 STATE.ch_wakers[n].wake();
153 } else if isr.tcif(chn) { 153 } else if isr.tcif(chn) {
154 STATE.ch_status[n].store(CH_STATUS_COMPLETED, Ordering::Release); 154 STATE.ch_status[n].store(CH_STATUS_COMPLETED, Ordering::Relaxed);
155 STATE.ch_wakers[n].wake(); 155 STATE.ch_wakers[n].wake();
156 } 156 }
157 } 157 }
@@ -301,7 +301,6 @@ pub struct M2P;
301 301
302#[cfg(usart)] 302#[cfg(usart)]
303use crate::usart; 303use crate::usart;
304use atomic_polyfill::compiler_fence;
305peripheral_dma_channels! { 304peripheral_dma_channels! {
306 ($peri:ident, usart, $kind:ident, RX, $channel_peri:ident, $dma_peri:ident, $channel_num:expr, $event_num:expr) => { 305 ($peri:ident, usart, $kind:ident, RX, $channel_peri:ident, $dma_peri:ident, $channel_num:expr, $event_num:expr) => {
307 impl usart::RxDma<peripherals::$peri> for peripherals::$channel_peri { } 306 impl usart::RxDma<peripherals::$peri> for peripherals::$channel_peri { }
diff --git a/stm32-data b/stm32-data
Subproject 9856b11172ae27ffa60d339ac271d2d06c19075 Subproject f0a6585b4806b1f7c6836126d063eaaf970cc5a