forked from M-Labs/artiq-zynq
runtime/kernel/dma: reduced replay overhead
We can just flush the cache once when we get the handle, instead of everytime before replay.
This commit is contained in:
parent
03d9827a5a
commit
a374d8a02f
@ -7,7 +7,6 @@ use alloc::{vec::Vec, string::String, boxed::Box};
|
||||
use cslice::CSlice;
|
||||
use super::{KERNEL_IMAGE, KERNEL_CHANNEL_0TO1, KERNEL_CHANNEL_1TO0, Message};
|
||||
use core::mem;
|
||||
use log::debug;
|
||||
|
||||
use libcortex_a9::cache::dcci_slice;
|
||||
|
||||
@ -160,6 +159,7 @@ pub extern fn dma_retrieve(name: CSlice<u8>) -> DmaTrace {
|
||||
// trailing zero to indicate end of buffer
|
||||
v.push(0);
|
||||
v.copy_within(0..original_length, padding);
|
||||
dcci_slice(&v);
|
||||
let v = Box::new(v);
|
||||
let address = Box::into_raw(v) as *mut Vec<u8> as i32;
|
||||
return DmaTrace {
|
||||
@ -174,12 +174,10 @@ pub extern fn dma_retrieve(name: CSlice<u8>) -> DmaTrace {
|
||||
}
|
||||
|
||||
pub extern fn dma_playback(timestamp: i64, ptr: i32) {
|
||||
debug!("DMA playback started");
|
||||
unsafe {
|
||||
let v = Box::from_raw(ptr as *mut Vec<u8>);
|
||||
let padding = ALIGNMENT - v.as_ptr() as usize % ALIGNMENT;
|
||||
let padding = if padding == ALIGNMENT { 0 } else { padding };
|
||||
dcci_slice(&v[padding..]);
|
||||
let ptr = v.as_ptr().add(padding) as i32;
|
||||
|
||||
csr::rtio_dma::base_address_write(ptr as u32);
|
||||
@ -190,8 +188,8 @@ pub extern fn dma_playback(timestamp: i64, ptr: i32) {
|
||||
while csr::rtio_dma::enable_read() != 0 {}
|
||||
csr::cri_con::selected_write(0);
|
||||
|
||||
// leave the handle as we may try to do playback for another time.
|
||||
mem::forget(v);
|
||||
debug!("DMA playback finished");
|
||||
|
||||
let error = csr::rtio_dma::error_read();
|
||||
if error != 0 {
|
||||
|
Loading…
Reference in New Issue
Block a user