diff options
| author | Thales <[email protected]> | 2021-06-30 19:08:17 -0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-06-30 19:08:17 -0300 |
| commit | 334c3a44a42873b6d60d7020ece3f8e90870796f (patch) | |
| tree | 472d7573dc6395958e12db9eb267b28b61cec664 | |
| parent | d77d41193508795417f0b19bdc6153e92233da8e (diff) | |
| parent | e07dda8707acf30acd6af008b55fba0e6513b931 (diff) | |
Merge pull request #265 from thalesfragoso/some-fences
stm32: Adjust some fences around DMA
| -rw-r--r-- | embassy-stm32/src/dma/v2.rs | 17 | ||||
| m--------- | stm32-data | 0 |
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 @@ | |||
| 1 | use core::sync::atomic::{AtomicU8, Ordering}; | ||
| 2 | use core::task::Poll; | 1 | use core::task::Poll; |
| 2 | |||
| 3 | use atomic_polyfill::{AtomicU8, Ordering}; | ||
| 3 | use embassy::interrupt::{Interrupt, InterruptExt}; | 4 | use embassy::interrupt::{Interrupt, InterruptExt}; |
| 4 | use embassy::util::AtomicWaker; | 5 | use embassy::util::AtomicWaker; |
| 5 | use futures::future::poll_fn; | 6 | use 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)] |
| 303 | use crate::usart; | 303 | use crate::usart; |
| 304 | use atomic_polyfill::compiler_fence; | ||
| 305 | peripheral_dma_channels! { | 304 | peripheral_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 | ||
